code_book = new POINT [size];
POINTはいわゆるx,y座標の構造体です。これを
delete [] code_book;
しようとするエラーが発生します。
なにが問題なのでしょうか?
エラーの内容は何ですか?
おそらく,code_bookを書き換えてしまったのだと思いますが。
KNN.exe の 0x7c941230 でハンドルされていない例外が発生しました : ユーザー設定のブレークポイント。
というものです。
どうでしょう??
まさか
code_book[size]に値を入れたりはしていませんよね?
(POINT [size];のばあい使えるのは code_book[0]〜code_book[size-1])
それはしてないです。でも
balance_point = new POINT [size];
で別に確保したほうと
balance_point = code_book;
code_book = balance_point;
のようなやりとりはしています。
2重に delete している可能性はないでしょうか?
というか
balance_pointとcode_book
の関連性がわからないのであまりコメントできないかと。
二重にdeleteもしてないです。
関連性というとどういうことでしょうか?
balance_pointをの値を更新した後にもとのcode_bookにもどすつもりでプログラムを書きました。
少し整理してみます。
挙げられたコード
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;
はダメです。
すいません。質問です。
>1. newを2度しているがそれは正しいですか?
code_book
balance_point
両者ともそれぞれ
POINT* code_book
POINT* balance_point
と宣言しているのでnewすべきではないのでしょうか?
> と宣言しているので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;
}
ポインタと配列の違いをきちんと勉強してください。
今のソースだと、
balance_point = code_book;をした時点で
balance_point = new POINT [size];によって確保した配列のアドレスは
消失してますよ。
この意味はわかりますか?
わからないのであれば、ポインタと配列について勉強しなおしましょう。
あと、code_bookのアドレスを直接変更するような事をしていると
deleteで失敗します。
deleteに引き渡すのは、newで得られたアドレスを渡す必要あります。
code_book++;とか途中でしてたらアウトです。
これがどうしてアドレスを変更している事になるのかわからないなら
C++言語のインクリメントやデクリメントの勉強をやり直してください。
ありがとうございます。アドレスの消失が原因であったようです。
ツイート | ![]() |