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으로 생성되지 않았으므로 deleted가 아니 어서 오류입니다.

새로 작성한 메모리에 값을 복사하지 않는 한 이미 가리키는 것이 있으면 new으로 할당 할 필요가 없습니다.

0

x in in point 구조에 대한 두 번째 지정에 문제가 있습니다.

(*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은 sat 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); 
}