言語はC++で、開発環境はVisualStudio2019です。
現在C++を用いて開発を行っていますが、タイトルに示したようにメモリの管理について、どうしても自分で解決ができないことがあり、質問させていただきました。なお、変数や構造体の命名は実際の実装とは変えています。
#問題のコード
ヘッダファイルに以下のように構造体を宣言しています。
C++
1//a.h 2struct hoge { 3 int dataCnt; 4 int** data; 5 hoge(int cnt) { 6 dataCnt = cnt; 7 data = (int**)malloc(sizeof(int*)*cnt); 8 for(int i = 0;i < cnt;i++){ 9 data[i] = (int*)malloc(sizeof(int)*3); 10 } 11 } 12 ~hoge() { 13 for(int i = 0;i < dataCnt;i++){ 14 free(data[i]); 15 } 16 free(data); 17 } 18}
この構造体をソースファイルで以下のように使用しています。
C++
1//a.cpp 2 /*-----省略-----*/ 3 for(int i = 0;i < MAX_LOOP_COUNT;i++) { 4 hoge moge(ARRAY_SIZE); 5 /*-----いろいろな処理-----*/ 6 } 7 /*-----省略-----*/
#発生している問題
構造体hogeのコンストラクタにてmallocで動的メモリ確保を行っているので、当然freeによるメモリ解放が必要と思いデストラクタに処理を書いたのですが、これをデバッグしてみると"読み取り中のアクセス違反"だと怒られてプログラムが停止してしまいます。
forループを抜けて構造体変数mogeの寿命が終わってメモリが解放されているのかな、とも思ったのですが、mallocで確保したメモリがfreeせずに解放されるという話を聞いたことないしなぁ(これは完全に私の知識不足かと思われます...)とか思いながら、どういうことなのかわからず途方に暮れています。
#お聞きしたいこと
どなたか、どうして構造体のデストラクタでfreeを行うとアクセス違反となってしまうのか教えていただけないでしょうか。
#とりあえず...
ひとまずアクセスできないメモリが存在し続けてしまうかもしれないというのはどうにも怖いので、ヘッダファイルとソースコードを以下のように修正して開発を続けています(この状態ではメモリアクセス違反は発生しませんでした)。
C++
1//a.h 2struct hoge { 3 int dataCnt; 4 int** data; 5 hoge(int cnt) { 6 dataCnt = cnt; 7 data = (int**)malloc(sizeof(int*)*cnt); 8 for(int i = 0;i < cnt;i++){ 9 data[i] = (int*)malloc(sizeof(int)*3); 10 } 11 } 12 ~hoge() { 13 /*デストラクタで開放するのをやめる*/ 14 } 15}
C++
1//a.cpp 2 /*-----省略-----*/ 3 for(int i = 0;i < MAX_LOOP_COUNT;i++) { 4 hoge moge(ARRAY_SIZE); 5 /*-----いろいろな処理-----*/ 6 7 /*処理が終わった後に、デストラクタが呼ばれる前に構造体メンバ変数のメモリ解放を行う*/ 8 for(int i = 0;i < moge.dataCnt;i++){ 9 free(moge.data[i]); 10 } 11 free(moge.data); 12 } 13 /*-----省略-----*/
回答2件
あなたの回答
tips
プレビュー