2012-06-13 32 views
0

由於內存泄漏錯誤,我啓用了堆調試我開始在其他人的代碼中看到,並且將問題固定在某個類的析構函數上(至少,所以我認爲)下面的電話號碼是delete []Windows MS上的CRT堆調試VC++ 2005

MyClass::~MyClass() { 
    delete [] my_class_member_; 
} 

現在我證實,my_class_member_這是一個指針到一個結構對象的數組,比方說,MyStruct,一直用new []所以我不知道是什麼原因造成這種泄漏分配財產?這裏的new []呼叫的樣子:

delete [] my_class_member_; 
my_class_member_ = new MyStruct[somesize_]; 

接下來,結構MyStruct也相對簡單,如下(精簡):

struct MyStruct { 
    MyStruct() {} 
    ~MyStruct() { 
     for(PtrList<PClass>::iterator it(ps); it.more(); it.next()) { 
      delete it.cur(); 
     } 
     for(PtrList<RClass>::iterator it(rs); it.more(); it.next()) { 
      delete it.cur(); 
     } 
     delete shift; 
    } 
    PtrList<PClass> ps; 
    PtrList<RClass> rs; 
}; 

現在PtrList是指針列表(內置我們正在使用的應用程序開發包的類型)..我非常確定不會出現問題。無論如何,任何人都注意到這裏有什麼不妥?感謝任何見解。

+1

你是否遵守了**規則三**?從你提供的信息來看,你是否這樣做並不清楚。你需要提供一個*拷貝構造函數*和*拷貝賦值運算符*,它們對你的動態分配的成員進行深層拷貝。如果你不這樣做,這些操作員不是「私人」的,並且沒有被定義,那麼你不能確定他們沒有被使用,這是你的問題所在。 –

+0

謝謝你可能會對某事..我正在調查。 –

+0

我閱讀了三條規則的文章,但我的理解是,如果沒有完成副本/作業,它應該是安全的,我是對的嗎? –

回答

1

根據OP的要求添加註釋作爲答案。

你跟着Rule of Three
從你的展現它的信息,無論你做so.You需要提供拷貝構造函數拷貝賦值運算符該做深拷貝您的動態分配的成員的不明確。如果你不這樣做,如果這兩個運營商都不是private而且還沒有確定,那麼你不能確定它們沒有被使用,而這是你問題所在的地方