2011-03-04 12 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); 
} 

} 

は、私は大きなクラスで、このクラスへのポインタを作成します。

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

と関数の内部:私は機能を通過させた後、第三のクラスで初期化する

A* 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

私はそう

(そうでない場合は、あなたのコードの7行目のmydata何ですか?)mydataがあなたのクラスのメンバーであることを前提とし、動的配列は、あなたのクラスのメンバです。それを含むオブジェクトが破棄されたときに破棄したい場合は、クラスのデストラクタでメンバーの破棄を指示します。

~A() 
{ 
    delete [] mydata; 
} 

、あなたがdelete mypointerを呼び出すときに、配列を破壊するクラスのデストラクタを呼び出します:ような何か。

+0

おかげで、これは適切な方法であるとは確信できませんでした(あなたはAクラスの一部であるmydataに関して正しいです)。 – Simon

+0

@Simon:注意デフォルト以外のコピーコンストラクタと 'operator ='も必要になります。そうしないと、メモリが破壊されます。 – ildjarn

1

コンストラクタnew []いくつかのデータの場合、デストラクタは再びそれを削除する必要があります。

また、クラスのオブジェクトをコピーまたは割り当てるとどうなるかを検討する必要があります。新しいデータセットを作成して元のオブジェクトの値をコピーする必要がありますか?

関連する問題