Top.Mail.Ru
Ответы

Не работает конструктор копирования С++

123456789101112131415161718192021222324252627282930313233343536373839
 #include <iostream> 
using namespace std; 
class MyClass { 
private: 
	int Size; 
public: 
	int *data; 
	MyClass(int size) 
	{ 
		this-> Size = size; 
		this -> data = new int[size]; 
		for (int i = 0; i < size; i++) 
		{ 
			data[i] = i; 
		} 
		cout << "Вызвался конструктор " << this << endl; 
	}; 
	MyClass(const MyClass &other) { 
		this->Size = other.Size; 
		this->data = new int[other.Size]; 
		for (int i = 0; i < other.Size; ++i) { 
			this->data[i] = other.data[i]; 
		} 
	} 
	~MyClass() 
	{ 
		delete[] data; 
		cout << "Вызвался деструктор " << this << endl; 
	} 
 
}; 
 
int main() { 
	setlocale(LC_ALL, "ru"); 
	MyClass a(10); 
	MyClass b(a); 
 
	return 0; 
} 

Вызывается конструктор и деструктор для b(a), но для а вызывается только конструктор, без деструктора, подскажите, в чем причина?

По дате
По рейтингу
Аватар пользователя
Новичок
11мес

>Вызывается конструктор и деструктор для b(a), но для а вызывается только конструктор, без деструктора, подскажите, в чем причина?
Для обоих экземпляров вызывается и конструктор, и деструктор. Каким образом вы диагностировали, что для нет вызова деструктора?

Аватар пользователя
Высший разум
11мес
12345678910111213141516171819202122232425262728293031323334353637
 class MyClass { 
public: 
    using value_t = int; 
private: 
    size_t length; 
    value_t* data; 
public: 
    MyClass() 
        : length(0), data(nullptr) { 
        cout << "Вызов конструктора без параметров: " << data << '\n'; 
    } 
    MyClass(const size_t length) 
        : length(length), data(new(nothrow) value_t[length]) { 
        if (data != nullptr) { 
            for (size_t i = 0; i < length; ++i) { 
                data[i] = 0; 
            } 
        } 
        cout << "Вызов конструктора с параметром: " << data << '\n'; 
    }; 
    MyClass(const MyClass& other) 
        : length(other.length), data(new(nothrow) value_t[length]) { 
        if (data != nullptr) { 
            for (size_t i = 0; i < length; ++i) { 
                data[i] = other.data[i]; 
            } 
        } 
        cout << "Вызов конструктора копирования: " << data << '\n'; 
    } 
    ~MyClass() { 
        if (data != nullptr) { 
            delete[] data; 
            data = nullptr; 
        } 
        cout << "Вызов деструктора: " << data << '\n'; 
    } 
}; 
Аватар пользователя
Оракул
11мес

Проблема, которую вы описали, связана с тем, что объект `MyClass a` в вашей программе создается в пределах функции `main`, и его деструктор вызывается автоматически при завершении этой функции. Однако, если ваша программа завершает выполнение до вызова деструктора, например, из-за ошибки или из-за отсутствия дополнительных операций, вы не увидите вывода о вызове деструктора.

В вашем коде все в порядке с точки зрения реализации конструктора копирования и деструктора. Чтобы убедиться в этом, давайте добавим несколько операторов `cout` для отслеживания создания и уничтожения объектов. Кроме того, мы добавим некоторую задержку перед завершением программы, чтобы убедиться, что все деструкторы вызываются правильно.

Вот обновленный код:

```cpp

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
 #include <iostream>  
#include <chrono> 
#include <thread> 
 
using namespace std;  
 
class MyClass {  
private:  
    int Size;  
public:  
    int *data;  
    MyClass(int size)  
    {  
        this->Size = size;  
        this->data = new int[size];  
        for (int i = 0; i < size; i++)  
        {  
            data[i] = i;  
        }  
        cout << "Вызвался конструктор " << this << endl;  
    }  
 
    MyClass(const MyClass &other) {  
        this->Size = other.Size;  
        this->data = new int[other.Size];  
        for (int i = 0; i < other.Size; ++i) {  
            this->data[i] = other.data[i];  
        }  
        cout << "Вызвался конструктор копирования " << this << endl; 
    }  
 
    ~MyClass()  
    {  
        delete[] data;  
        cout << "Вызвался деструктор " << this << endl;  
    }  
};  
 
int main() {  
    setlocale(LC_ALL, "ru");  
    MyClass a(10);  
    MyClass b(a);  
 
    // Добавим задержку перед завершением программы 
    this_thread::sleep_for(chrono::seconds(1)); 
 
    return 0;  
} 
 

```

Теперь вы должны увидеть сообщения о вызовах деструкторов для обоих объектов `a` и `b`. Сообщение о вызове деструктора для объекта `a` появится после завершения функции `main`.