Не работает конструктор копирования С++
#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), но для а вызывается только конструктор, без деструктора, подскажите, в чем причина?
>Вызывается конструктор и деструктор для b(a), но для а вызывается только конструктор, без деструктора, подскажите, в чем причина?
Для обоих экземпляров вызывается и конструктор, и деструктор. Каким образом вы диагностировали, что для нет вызова деструктора?
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';
}
};
Проблема, которую вы описали, связана с тем, что объект `MyClass a` в вашей программе создается в пределах функции `main`, и его деструктор вызывается автоматически при завершении этой функции. Однако, если ваша программа завершает выполнение до вызова деструктора, например, из-за ошибки или из-за отсутствия дополнительных операций, вы не увидите вывода о вызове деструктора.
В вашем коде все в порядке с точки зрения реализации конструктора копирования и деструктора. Чтобы убедиться в этом, давайте добавим несколько операторов `cout` для отслеживания создания и уничтожения объектов. Кроме того, мы добавим некоторую задержку перед завершением программы, чтобы убедиться, что все деструкторы вызываются правильно.
Вот обновленный код:
```cpp
#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`.