メモリの開放について

解決


ど素人  2006-06-08 05:29:44  No: 62071

code_book = new POINT [size];
POINTはいわゆるx,y座標の構造体です。これを
delete [] code_book;
しようとするエラーが発生します。
なにが問題なのでしょうか?


YuO  2006-06-08 05:37:47  No: 62072

エラーの内容は何ですか?

おそらく,code_bookを書き換えてしまったのだと思いますが。


ど素人  2006-06-08 05:46:19  No: 62073

KNN.exe の 0x7c941230 でハンドルされていない例外が発生しました : ユーザー設定のブレークポイント。
というものです。
どうでしょう??


Blue  2006-06-08 06:00:10  No: 62074

まさか
code_book[size]に値を入れたりはしていませんよね?
(POINT [size];のばあい使えるのは code_book[0]〜code_book[size-1])


ど素人  2006-06-08 06:09:14  No: 62075

それはしてないです。でも
balance_point = new POINT [size];
で別に確保したほうと
balance_point = code_book;
code_book = balance_point;
のようなやりとりはしています。


Blue  2006-06-08 06:13:24  No: 62076

2重に delete している可能性はないでしょうか?
というか

balance_pointとcode_book

の関連性がわからないのであまりコメントできないかと。


ど素人  2006-06-08 19:35:38  No: 62077

二重にdeleteもしてないです。
関連性というとどういうことでしょうか?
balance_pointをの値を更新した後にもとのcode_bookにもどすつもりでプログラムを書きました。


Blue  2006-06-08 19:49:15  No: 62078

少し整理してみます。

挙げられたコード

code_book = new POINT [size];


balance_point = new POINT [size];


balance_point = code_book;
code_book = balance_point;


delete [] code_book;

1. newを2度しているがそれは正しいですか?
2. 1で正しい場合、delete[]はも一つ必要ではないか?
3. 代入(入れ替え?)のところはあっていますか?
POINT* temp
temp = code_book;
code_bo = balance_point;
balance_point = temp;
ではないか?
4. delete対象の値は本当に正しいか?
   newで確保した値でないと、deleteは失敗します。
例えば
int* p = new int[ 10 ];
*p = 10;
p++;
*p = 20;
delete[] p;
はダメです。


ど素人  2006-06-08 23:46:15  No: 62079

すいません。質問です。
>1. newを2度しているがそれは正しいですか?
code_book
balance_point
両者ともそれぞれ
POINT* code_book
POINT* balance_point
と宣言しているのでnewすべきではないのでしょうか?


Blue  2006-06-08 23:56:38  No: 62080

> と宣言しているのでnewすべきではないのでしょうか?

使われ方によりますけど。
示されたコードではそれが明確にされていないのでなんともいえません。

適当にこんな処理を予想している)
#include <iostream>

int main()
{
    const int size = 10;
    int* p = new int[ size ];
    int* q;

    q = p;

    int i = 0;
    while ( i < size )
    {
        *q = i * 2;
        q++;
        i++;
    }

    for ( i = 0; i < size; i++ )
    {
        std::cout << "p[" << i << "]=" << p[ i ] << std::endl;
    }
    delete[] p;
    
    return 0;
}


PATIO  2006-06-09 00:05:37  No: 62081

ポインタと配列の違いをきちんと勉強してください。
今のソースだと、

balance_point = code_book;をした時点で
balance_point = new POINT [size];によって確保した配列のアドレスは
消失してますよ。
この意味はわかりますか?
わからないのであれば、ポインタと配列について勉強しなおしましょう。

あと、code_bookのアドレスを直接変更するような事をしていると
deleteで失敗します。
deleteに引き渡すのは、newで得られたアドレスを渡す必要あります。
code_book++;とか途中でしてたらアウトです。
これがどうしてアドレスを変更している事になるのかわからないなら
C++言語のインクリメントやデクリメントの勉強をやり直してください。


ど素人  2006-06-09 05:59:51  No: 62082

ありがとうございます。アドレスの消失が原因であったようです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加