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

时间:2017-10-22 05:08:37

标签: c++ pointers struct dynamic-memory-allocation delete-operator

我收到了以下转述的问题: "仅使用变量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;
}

2 个答案:

答案 0 :(得分:1)

你似乎有点混乱

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

第一行将x指向一个新整数,但下一行会将其覆盖为srcX,从而丢失先前分配的内存。由于x指向的内容未使用new创建,因此不应为delete d,因此错误。

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

答案 1 :(得分:0)

在点结构中对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让我们坐在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);
}