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

时间:2011-01-13 13:57:56

标签: c memory free

我有两个结构

struct SimpleXY
{
    double x;
    double y;

};

    struct SimpleXyLink
    {
            int num_xy;
            SimpleXY *simpleXyList;
    };

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

void Free(SimpleXyLink *myList)
{

    free(myList->simpleXyList);
}

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

3 个答案:

答案 0 :(得分:5)

首先,你没有释放的内存是SimpleXy * Link * myList,而不是simpleXyList中的内存(你释放的内存就是那么好了) )。

一般情况下,您需要找到一种方法来释放您正在使用的所有内存。通常,您将在引用它的结构之前释放引用的数据,如:

void FreeSimpleXy(SimpleXyLink *myList) {
    free(myList->simpleXyList);
    free(myList);
}

注意(仅限C ++),如果您使用new分配这些内容,则必须使用删除代替!

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

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

现在你可以做delete someLink;,它会自动释放包含的simpleXyList。 ,请注意,不得现在使用mallocfree - 使用newdelete代替:

SimpleXyLink *link = new SimpleXyLink;
link->simpleXyList = new SimpleXYList;
delete link; // all gone!

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

struct SimpleXyLink {
    int num_xy;
    boost::scoped_ptr<SimpleXyList> simpleXyList; // or shared_ptr
};

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

答案 1 :(得分:2)

如果是C ++(我在这里很困惑,因为你使用免费: - ))

struct SimpleXY
{
    double x;
    double y;

};

struct SimpleXyLink
{   
    SimpleXyLink() : simpleXyList( new SimpleXY ) { }
    ~SimpleXyLink() { delete simpleXyList; }

    int num_xy;
    SimpleXY *simpleXyList;
};

int main() 
{
    SimpleXyLink* pXYLink = new SimpleXyLink();

    delete pXYLink;
}

答案 2 :(得分:0)

这完全取决于你如何分配内存。释放内存总是要回应分配。

那就是说,free在C ++中几乎肯定是错误的。使用new / delete代替malloc / free

此外,似乎你正在为她的几个元素分配内存(至少名称…List暗示这一点)所以你可能最好使用C ++容器结构,例如{{1} }或vector