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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ナイ

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

#1

投稿記事 by ナイ » 15年前

こんばんは いつもお世話になっています。

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




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自体の開放はしなくてもよいのでしょうか??


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

gyz

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

#2

投稿記事 by gyz » 15年前

領域を確保している部分の
> for( int i = 0; i <= LINE_NUM; i ++ )
ここが原因ですね

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

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

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

うしお

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

#3

投稿記事 by うしお » 15年前

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による多次元配列の開放について

#4

投稿記事 by ナイ » 15年前

こんにちは

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る