Мне было интересно, как написать оператору =
, чтобы освободить существующую выделенную память от переменной.Использование оператора = в сочетании с новым оператором
Например, в приведенном ниже коде при переназначении указателя x
x = new ClassExample(4)
будет удалена старая память x->a
.
По-видимому, при использовании new
, оператор =
не применяется (это только для уже существующих значений).
Есть ли способ сделать это (свободная старая память при назначении новой памяти)?
#include <iostream>
#include <cstdlib>
class ClassExample {
public:
int* a;
ClassExample& operator= (const ClassExample& rightSide) {
//.....
}
ClassExample(int val) {
a = new int(val);
}
};
int main()
{
ClassExample* x = new ClassExample(2);
x = new ClassExample(4);
return 0;
}
В этом случае оператор назначения не вызывается, потому что вы используете указатели, а не прямые экземпляры. А также помните, что выделенная память никогда не будет автоматически бесплатной, вы должны это сделать. Использование [умных указателей] (http://en.cppreference.com/w/cpp/memory/shared_ptr) помогает. –
На самом деле, в таком случае, * почему * вы используете указатели? И я имею в виду не только указатели ClassExample в 'main', но и указатель участника' a' в классе! Правила, которым вы должны следовать, следующие: 1. Не используйте указатели. 2. Если вам нужно использовать указатели, не делайте этого. 3. Если вам все еще нужно использовать указатели, используйте интеллектуальные указатели. –
Подумайте о безопасности исключений – doctorlove