搜尋

首頁  >  問答  >  主體

c++自我赋值问题

effective第11个条款举的这个例子:

 Widget& Widget::operator=(const Widget& rhs)    //一份不安全的operator=实现版本
 {
    delete pb;
     pb = new Bitmap(*rhs.pb);
     return *this;
 }
 

像上面这样写,自我赋值肯定会出现问题,但是为什么要先释放掉pb呢?为什么不直接像下面这样重赋值呢?

 Widget& Widget::operator=(const Widget& rhs)    //一份不安全的operator=实现版本
 {
     pb = new Bitmap(*rhs.pb);
     return *this;
 }
 
ringa_leeringa_lee2774 天前391

全部回覆(2)我來回復

  • ringa_lee

    ringa_lee2017-04-17 13:47:27

    第二種寫法當自我複製時會造成記憶體洩漏

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:47:27

    pb的作用就是在可以引用的值和堆上的記憶體物件之間進行綁定的,你要存取堆上的物件的話,需要透過pb來操作。

    見上圖,按照你舉得例子,你指示讓pb又指向了一個新的堆上內存地址,但之前的你沒有顯示delete掉,就會產生內存洩漏。

    洩漏的例子

    class BigData{
    private:
        int data[1024*1024*128];
    };
    
    int main(){
        BigData *p = 0;
        for (int i = 0; i < 4; ++i) {
            p = new BigData();
        }
        return 0;
    }
    
    
    
    BigData是一个大小为128MB的对象,创建了4个,没释放,则可以看到程序运行期内存一直增长。

    回覆
    0
  • 取消回覆