Одна заметка, не связанная с вашим вопросом, утверждение A a = A();
, вероятно, не соответствует вашим ожиданиям. В C ++ объекты не являются ссылочными типами, которые по умолчанию имеют значение null, поэтому это утверждение почти никогда не является правильным. Вы, вероятно, хотите просто A a;
A a
создает новый экземпляр A
, но часть = A()
вызывает конструктор копирования A
с временным значением по умолчанию, созданным A
. Если бы вы сделали просто A a;
, он просто создал бы новый экземпляр A
, используя конструктор по умолчанию.
Если вы явно не реализуете свой собственный конструктор копирования для класса, компилятор создаст его для вас. Созданный компилятором конструктор копирования просто сделает точную копию данных другого объекта; это означает, что если у вас есть какие-либо указатели, он не будет копировать указанные данные.
Таким образом, по существу, эта строка создает новый экземпляр A
, затем создает другой временный экземпляр A
с помощью конструктора по умолчанию, затем копирует временный A
в новый A
, затем уничтожает временный A
. Если временный A
получает ресурсы в своем конструкторе и отменяет их распределение в своем деструкторе, вы можете столкнуться с проблемами, когда ваш объект пытается использовать данные, которые уже были освобождены, что является неопределенным поведением.
Возьмите этот код, например:
struct A {
A() {
myData = new int;
std::cout << "Allocated int at " << myData << std::endl;
}
~A() {
delete myData;
std::cout << "Deallocated int at " << myData << std::endl;
}
int* myData;
};
A a = A();
cout << "a.myData points to " << a.myData << std::endl;
Вывод будет выглядеть примерно так:
Allocated int at 0x9FB7128
Deallocated int at 0x9FB7128
a.myData points to 0x9FB7128
Как видите, a.myData
указывает на адрес, который уже был освобожден. Если вы попытаетесь использовать данные, на которые оно указывает, вы можете получить доступ к абсолютно недействительным данным или даже к данным какого-либо другого объекта, который занял свое место в памяти. И затем, как только ваш a
выйдет из области видимости, он попытается удалить данные во второй раз, что вызовет больше проблем.