2011-03-04 133 views
3

基本上我有一個類A,它在構造時創建一個數組。刪除指向創建數組的類的指針

class A 
{ 
public: 
A (float height, float width, BYTE* data) 
{ 
    setsize(height,width); 
    mydata = CreateNewBuffer(sizes); 
    setdata(data);  
} 


~A() 
{ 

} 
void setsize(float height, float width) 
{ 
    sizes.cx = width; 
    sizes.cy = height; 
} 

BYTE* CreateNewBuffer (SIZE sImage) 
{ 
    return new BYTE [sImage.cx * sImage.cy]; 
} 

void setdata(BYTE* data) 
{ 
    memcpy(threatdata,data,sImage.cx * sImage.cy); 
} 

} 

我在更大的類中創建一個指向這個類:

A* mypointer; 

我初始化在一個第三類使其通過一個函數之後:

3rdClass::instance()->myfunction(mypointer) 

和在函數內部myfunction()我設置了一個布爾值,表明這個類是構造的

mypointer = new A(height,width,data); 
wasconstructed = true; 

現在,下一次我傳遞指向函數myfunction()的指針,我檢查該類是否已經構建,如果是,我想刪除它,以便創建一個沒有丟失內存的新類。

什麼是正確的方式做到這一點:我想基本的東西,像

if (3rdClass::instance()->checkifconstructed()){ 
    delete mypointer; //(or even delete [] mypointer but then i get heap corruption) 
    mypointer = NULL; 
} 

但是,這似乎並沒有工作。

+0

你是什麼意思?「我想刪除它,以便創建一個沒有丟失內存的新文件。」你想回收緩衝區? – Bernhard

+0

是的,但問題是,高度和寬度每次都改變 – Simon

回答

4

我認爲mydata是你的類的成員(否則,什麼是你的代碼的7條線mydata?)

因此,動態數組是你的類的成員。如果你想在銷燬包含對象的時候銷燬它,你應該這樣做:在你的類的析構函數中命令銷燬你的成員。喜歡的東西:

~A() 
{ 
    delete [] mydata; 
} 

現在,當你調用delete mypointer它將調用類,它會破壞陣列的析構函數。

+0

好的謝謝,我不確定這是正確的路要走(你對mydata是A類的一部分是正確的) – Simon

+0

@Simon:Note你還需要一個非默認的拷貝構造函數和'operator =',否則你會得到內存損壞。 – ildjarn

1

如果構造函數new []有一些數據,析構函數應該再次刪除[]它。

你也應該考慮如果你複製或分配給類的對象會發生什麼。你是否需要創建一組新的數據並複製原始對象的值?