2011-03-11 27 views
3

如何從淺拷貝對象vs原始對象中刪除雙(刪除)錯誤。當使用對象的淺拷貝時出現雙倍空閒錯誤...如何修復?

一個簡單的例子:

class INT 
{ 
    int *p; //dynamic. 

    //define here fancy constructors etc. 
    set(int i){ p=new int; p=i;} 
    ~INT(); 
} 

INT::~INT() 
{ 
    if(p) delete p; 
} 

void somefunction(INT a) 
{ 
    //done some stuff ,e.g. call some display function 
} 
//note here, that a destructor will be called, and a.p will vanish. 

int main(void) 
{ 
    INT a; a.set(2); 
    somefunction(a);//shallow copy 
} 
//CRASH BOOM BOOM! 

我想一個通用的解決方案,因爲傳遞對象是一件微不足道的小事,和幼稚,因爲這東西,結果變成一個可怕/了不起的錯誤僅僅是「真棒」。

我懷疑有解決這個許多方面(其中一些甚至是我能想到的),但我很好奇,如果有解決這個問題的任何通用(適用幾乎無處不在)的方式?

+0

可能重複[什麼是複製和交換成語?](http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom) – 2011-03-11 02:31:55

+0

可能重複的[什麼是三條規則?](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-reeree) – 2011-03-11 02:32:16

+0

注意:我不想使用引用,或者使用引用泛型方案? – nikhilelite 2011-03-11 02:51:24

回答

2

對於動態成員的所有對象,它通常是最好的定義因爲這個原因你自己的拷貝和複製賦值操作。

關於「一大」的對象和昂貴的複製,reference counting是許多語言和模式用來規避指針所有權這個問題的技術。請注意,在這種情況下,對象的所有副本指向相同的共享對象,因此其他人可以看到從一個實例修改共享對象。有關更多信息,請參閱boost shared_ptr文檔。

5

只要你有你的類中apointer對象,那麼你需要聲明自己的拷貝構造函數和賦值操作符的方法來避免淺拷貝的問題。 此處看到這個link關於這個的信息

+0

沒有問題,在這種情況下,對象只是一個簡單的int,在其他情況下,它可能是複製昂貴的東西。 – nikhilelite 2011-03-11 02:57:36

+0

@nik:通過什麼測量? – GManNickG 2011-03-11 02:58:25

+0

大陣例如... – nikhilelite 2011-03-11 03:10:51

3

病人:醫生,當我這樣做的時候疼!
醫生:不要這樣做。

機會是至少100:1,你可以寫你的代碼就好了無需處理原始指針。根據情況,你可能需要一個智能指針或者你可能需要一個集合,但是你需要一個指針的機會看起來很遙遠。

不要問有關如何解決你在做什麼的,你會好得多告訴我們你想實現什麼,所以我們可以告訴你如何做到這一點。

+0

關於這類問題的決定性文章的任何提示。 – nikhilelite 2011-03-11 02:59:56

+1

你還沒有真正告訴我們這個問題*是什麼。如果你想避免深層複製,你可能想要看看像Boost的智能指針:http://www.boost.org/doc/libs/1_46_0/libs/smart_ptr/smart_ptr.htm – 2011-03-11 03:06:01

1

問題「我如何避免從淺拷貝對象的雙重刪除?」應該真的是「當我不需要這些時,我該如何避免淺拷貝?」。

某些選項:
- 避免分配的內存
原始指針 - 不要複製的對象! :-)
- 管理內存中的對象
之外 - 使用智能指針
- 實現深度複製

您的選擇取決於您實際使用對象的。