У меня есть «витая» вопрос ... Пусть иметь класс какC++ удалить/деструктор безопасный вызов
class MyClass {
public:
MyClass();
~MyClass();
MyClass& operator=(const MyClass& obj);
private:
int* mem;
};
, где в основном MyClass
inits как-то mem
(с new
вызова), то ~MyClass()
mem
освобождает с оператором delete
. Пусть, кроме того, оператор =
перегружен с кодом
MyClass& operator=(const MyClass& obj) {
if(this != &obj) {
//allocate memory of "this" with the "new" operator and copy "obj" data;
}
return *this;
}
мой вопрос в основном следующее ... С следующей последовательности операторов
//statement 1 for short
MyClass my_obj = some_obj_of_MyClass;
я предполагаю, что все в порядке, так как оператор =
выделяет памяти и копирует данные, но со следующими данными:
//statement 2 for short
MyClass obj; //allocate memory for "mem"
obj = some_obj_of_MyClass;
если вы считаете, что это не так t исправить реализацию, которую я предложил, поскольку я не удаляю выделенную память раньше. Я мог бы вызвать деструктор внутри блока оператора присваивания, но в этом случае, вероятно, утверждение 1 не было бы безопасным.
Так что это безопасный способ реализовать все? Я предполагаю, что проблема здесь заключается в том, чтобы понять, когда вызывается деструктор или как его правильно реализовать.
В вашем первом примере используется конструктор копирования, а не 'operator ='. В 'operator =' гарантируется, что 'this' относится к уже построенному объекту. – melpomene
'// statement 1' запускает конструктор копирования (сгенерированный компилятором), * не * a (определяемый пользователем) оператор присваивания. Он просто установит 'my_obj.mem' то же значение, что и' some_obj_of_MyClass.mem', поэтому у вас будет два объекта, указывающих на одну и ту же память, и, в конечном счете, на двойное разрушение. Так что нет, это не нормально. См. Также: [Правило три] (https://en.wikipedia.org/wiki/Rule_of_three_ (C% 2B% 2B_programming)) –
Является ли выражение '// 1 эквивалентом' MyClass obj (some_obj_of_MyClass) '? – user8469759