如何释放指针到另一个结构的结构记忆

Gra*_*ton 1 c memory free

我有两个结构

struct SimpleXY
{
    double x;
    double y;

};

    struct SimpleXyLink
    {
            int num_xy;
            SimpleXY *simpleXyList;
    };
Run Code Online (Sandbox Code Playgroud)

我想知道释放内存的正确方法是SimplyXyLink什么?我目前正在使用

void Free(SimpleXyLink *myList)
{

    free(myList->simpleXyList);
}
Run Code Online (Sandbox Code Playgroud)

但我认为这是错误的,因为它没有释放元素内部的内存simpleXyList.

bdo*_*lan 5

首先,你没有释放的内存是SimpleXy*Link*myList,而不是simpleXyList中的内存(你正在释放那个引用的内存就好了).

一般来说,由你决定一种释放你正在使用的所有内存的方法.通常,您将在引用它的结构之前释放引用的数据,如:

void FreeSimpleXy(SimpleXyLink *myList) {
    free(myList->simpleXyList);
    free(myList);
}
Run Code Online (Sandbox Code Playgroud)

但是,注意(仅限C++),如果您曾经new分配这些,则必须使用delete来代替!

如果你正在使用C++,那么还有更多万无一失的方法.首先是析构函数.你可以这样改变SimpleXyLink:

struct SimpleXyLink
{
    int num_xy;
    SimpleXY *simpleXyList;
    ~SimpleXyLink() {
        delete simpleXyList;
    }
    SimpleXyLink() {
        simpleXyList = NULL; // run when object is created with new
    }
};
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做delete someLink;,它将自动释放包含的simpleXyList.但是,请记住,你不能使用mallocfree现在-使用newdelete替代:

SimpleXyLink *link = new SimpleXyLink;
link->simpleXyList = new SimpleXYList;
delete link; // all gone!
Run Code Online (Sandbox Code Playgroud)

最后,还有一种几乎是神奇的做事方式 - 使用智能指针(仅限C++).这些将被添加到下一版本的C++中,但您现在可以使用boost库来使用它们.

struct SimpleXyLink {
    int num_xy;
    boost::scoped_ptr<SimpleXyList> simpleXyList; // or shared_ptr
};
Run Code Online (Sandbox Code Playgroud)

这些将消除编写析构函数的需要(你仍然必须使用new,delete但是!),但它们也带有其他限制.在使用之前,请仔细阅读我链接的文档,如果您仍然不确定,请随时打开另一个问题.