0

"変数qのみを使用し、構造体ポイント内の整数ポインタに動的にメモリを割り当てます"という言い方をしました。私は次のコードを書いたが、動的に割り当てられた整数を削除することはできません。存在しないものを削除しているというランタイムエラーが発生するためです。私は割り当て後に ((* q) - > x - > x)とsrcXのメモリアドレスをチェックし、それらは同じアドレスを持っています。この動的に割り当てられた整数を解放するにはどうすればよいですか?別の構造内の構造体内のポインタの割り付けを解除する

#include <iostream> 

using namespace std; 

struct point { 
    int *x; 
    int *y; 
}; 

struct line { 
    struct point *x; 
    struct point *y; 
}; 

void create_line (int srcX, int srcY, int dstX, int dstY) { 
    struct line *p; 
    struct line **q = &p; 
    (*q) = new line; 
    (*q) -> x = new point; 
    (*q) -> x -> x = new int; 
    (*q) -> x -> x = &srcX; 
    cout << *((*q)->x->x) << endl; 
    delete (*q)->x->x; // Causing run-time error 
    delete (*q)->x; 
    delete (*q); 
} 

int main(){ 
    create_line(2,3,7,8); 
    return 0; 
} 

答えて

1

現在地

(*q) -> x -> x = new int; 
(*q) -> x -> x = &srcX; 

最初の行は、新しい整数にxを指すが、次の行は、以前に割り当てられたメモリを失う、それはsrcXを指すように上書きされ、いくつかの混乱があるようです。 xが指し示すものはnewで作成されていないため、delete dであってはなりません。したがって、エラーです。

あなたが既に指している場合(新しく作成されたメモリに値をコピーしない限り)、newで割り当てる必要はありません。

0

xイン・ポイント構造への2番目の割り当てに問題があります。

(*q) -> x -> x = new int; // here you are allocating new memory for x 
(*q) -> x -> x = &srcX; // here you override the address you got from prev allocation 

それでは、実際に起こることは(*q) -> x -> xはのは、アドレス0x1000番地を言わせnew intから新たに割り当てられたメモリへのアドレスを保持することです。次の行では、(*q) -> x -> xは、渡された引き数にアドレスを保持しますsrcXは0x2000にします。 あなたが得ているのは、newを使って割り当てたメモリへのアドレスがなくなったことです。このメモリは今やなくなりました。delete (*q)->x->xに到達すると、メモリを解放しようとしているのでエラーが発生します。 newを使用して割り当てられていない

私はあなたがこのように見えるように機能を変更すべきだと思う:

void create_line (int srcX, int srcY, int dstX, int dstY) { 
    struct line *p; 
    struct line **q = &p; 
    (*q) = new line; 
    (*q) -> x = new point; 
    // (*q) -> x -> x = new int; -> no need to allocate memory 
    (*q) -> x -> x = &srcX; 
    cout << *((*q)->x->x) << endl; 
    // delete (*q)->x->x;  -> no need to free it 
    delete (*q)->x; 
    delete (*q); 
} 
関連する問題