ページ 11

newによる多次元配列の開放について

Posted: 2010年10月08日(金) 02:57
by ナイ
こんばんは いつもお世話になっています。

今回、以下のようなコードをプログラムの一部で組んでいます。




CHAR** BUF_STRING_A;
INT CREATE_STRING(VOID)
{
BUF_STRING_A = new CHAR*[ LINE_NUM ];//1次元での確保
for( int i = 0; i <= LINE_NUM; i ++ )
{
BUF_STRING_A = new CHAR[ STRING_NUM ];//各ポインタに2次元分の確保
}

return 0;
}
INT DELETE_STRING(VOID)
{
for( int i = 0; i <= this->LINE_NUM; i ++ )
{
if( this->BUF_STRING_A == NULL ) continue;

delete this->BUF_STRING_A;
this->BUF_STRING_A = NULL;
}
if( this->BUF_STRING_A != NULL )
{
delete this->BUF_STRING_A;
this->BUF_STRING_A = NULL;
}
}


その中で最後から4行目の
delete this->BUF_STRING_A;で

「Windows によって Project.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。Project.exe または読み込まれた DLL にバグがあります。
あるいは、Project.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。」
というエラーがでます。

調べたところ、開放済みなどのポインタを再度deleteするなどをすると起きると書かれていたのですが
配列 CHAR* BUF_STRING_A の開放をしたあと大元であるCHAR** BUF_STRING_A自体の開放はしなくてもよいのでしょうか??


分かりにくい文ですが、よろしくお願いいたします。

Re:newによる多次元配列の開放について

Posted: 2010年10月08日(金) 07:32
by gyz
領域を確保している部分の
> for( int i = 0; i <= LINE_NUM; i ++ )
ここが原因ですね

0~LINE_NUMまでforで回すとLINE_NUM+1回実行されます
確保した領域外までアクセスすることになり
ヒープを破壊するのでdeleteの時にエラーになります

deleteの部分のfor文でも同じミスがありますので
修正が必要ですね

時々やっちゃう、うっかりミスですね

Re:newによる多次元配列の開放について

Posted: 2010年10月08日(金) 09:18
by うしお
BUF_STRING_A = new CHAR*[ LINE_NUM ];
と配列newを行った場合、
delete this->BUF_STRING_A;ではだめで、
配列用のdeleteである、
delete[/url] this->BUF_STRING_A;
という開放処理をしなければなりません。

 new CHAR[ STRING_NUM ]こちらも同様です

エラーこそ出ませんが注意が必要です

Re:newによる多次元配列の開放について

Posted: 2010年10月08日(金) 11:47
by ナイ
こんにちは

ご返答ありがとうございます。
凡ミス2つもしていたとは・・・。
それで実行したところやはり同じミスがでるとおもったところ
終了処理に加え、デスストラクタでも読み込んでいたという設計のミスもありました。

多くにお騒がせして申し訳ございませんでした。
またなにかありましたときはよろしくお願いいたします、