2012-05-02 2 views
1

Пусть один имеет следующий код:проблема памяти с оператором перегрузки

class MyClass { 
public: 
    MyClass(int foo) : foo(foo){} 

private: 
    int foo; 

//overloaded operator + 
public: 
    MyClass operator+(MyClass &mc){ 
     MyClass c(mc.foo + foo); 
     return c; 
    } 
}; 

int main(int argc, char* argv[]){ 
    MyClass c1(10); 
    MyClass c2(12); 

    c2 = c1 + c2; 

    return EXIT_SUCCESS; 
} 

Если оператор + перегрузка, так что он не изменяет объект, но создать новый объект и вернуть его.

Когда c2 = c1 + c2 вызывается, c2 связан с новым объектом, но предыдущий объект, связанный с c2, не освобожден (или, по крайней мере, мне кажется). Я прав?

Поскольку C++ не имеет сборщика мусора, это проблема?

Я что-то упустил?

+0

Сделать его 'MyClass operator + (MyClass const & mc) const', так что' c1 + c2 + c3' работает, и все в порядке. –

+0

Если вы напишете более правильный 'MyClass operator + (MyClass const & mc) const {return MyClass (mc.foo + foo); } ', вы можете быть менее смущены. –

+0

Как правило, в C++, когда он выглядит довольно, это правильно и делает правильную вещь. Ключевым умением является заставить его выглядеть красиво :-) –

ответ

1

При вызове c2 = c1 + c2 c2 связан с новым объектом, но предыдущий объект, связанный с c2, не освобождается (или, по крайней мере, мне кажется).

Нет, это не то, что происходит.

Нет «предыдущего объекта, связанного с c2»; c2 не является ссылкой на объект, он is объект. Время жизни c2 начинается, когда оно объявляется и заканчивается, когда оно выходит за рамки.

Оператор присваивания не переустанавливает c2 (что было бы бессмысленным - c2 не является ссылкой на java-стиль!), Он присваивает ему. В частности, он вызывает c2.operator=(MyClass) или c2.operator=(const MyClass&). c2 существовал до назначения, и тот же объект продолжает существовать после назначения.

3

Объект является локальным. Только когда память распределяется динамически (используя новый или malloc), нам нужно беспокоиться о явном освобождении. Локальные переменные уничтожаются один раз из сферы действия.

+0

И он передается обратно по значению, конечно .... не хочу, чтобы OP думала, что возвращаемое значение будет недействительным. –

Смежные вопросы