在另一个结构中释放一个结构内的指针

Deallocating a pointer inside a structure within another structure

我得到了以下释义问题: "Using only the variable q, dynamically allocate memory for the integer pointers inside the struct point"。我写了下面的代码,但是,我无法删除动态分配的整数,因为它给我一个 运行 时间错误,说我正在删除不存在的东西。我检查了内存地址 ((*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;
}

你好像有点糊涂了

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

第一行指向 x 一个新的整数,但下一行将其覆盖为指向 srcX,丢失了之前分配的内存。由于 x 指向的内容不是用 new 创建的,因此它不应该是 deleted,因此会出现错误。

如果您已经拥有指向的内容,则无需使用 new 进行分配(除非您打算将该值复制到新创建的内存中)。

你在点结构中对 x 的第二次赋值有问题。

(*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 将保存从 new int 新分配的内存地址,假设地址为 0x1000。在下一行中,(*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);
}