2012-02-12 55 views
0

比方說,我有一個A級:刪除在運營商不使用的對象=重載

class A 
{ 
    private: 
    int value; 
    public: 
    A(int value) 
    { 
     this->value=value; 
    } 
    A& operator= (A& obj) 
    { 
     value=obj.value; 
    } 
}; 

有一個問題,如果我使用上下文實例:

A obj; 
obj=*new A(5); 

這種情況下,新對象創建不會被刪除,我會失去它的參考。 所以我可以把在運營商=重載函數中的指令來刪除它是分配的權值的對象,但如果我這樣做:

A obj1,obj2; 
obj1=obj2; 

那麼如何避免浪費內存?有辦法嗎?

@Oli Charlesworth: 但是那麼迭代器是如何實現的呢?例如,在標準::名單,如果我說:

list<string> l; 
// initialize the list elements 
list<string>::iterator i=l.begin(); 

這是一個任務,就是那種名單的另一個目的是:迭代產生的?

+0

是的,你正在製作一個'list :: iterator'的副本。迭代器被設計爲可複製的。如果你想了解更多關於對象是如何被創建和銷燬的,你可以選擇[一本好的C++書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list )。 – 2012-02-12 13:27:18

+0

那麼由l.begin()創建的對象會丟失? – 2012-02-12 13:34:28

回答

7

是的,解決方法是不要做obj = *new A(5)。請做obj = A(5)


順便說一句,你的拷貝賦值運算符應利用其作爲一個const裁判爭論。

1

這是一個可怕的想法做:

obj=*new A(5); 

不允許你摧毀參考new A(5)了。所以,你不會有記憶問題結束

A obj(5); 

A obj; 
obj = A(5); 

你一定要了解"Rule of three":相反,初始化直接或通過賦值運算符A& operator= (const A& other)

+0

我不確定這是否與此相關。 – 2012-02-12 13:25:06

+0

@OliCharlesworth:編輯我的答案使其更加清晰。關於OP的編輯,我假設他不知道如何複製構造函數等工作。 – AndiDog 2012-02-12 13:39:18