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

我有两个结构

struct SimpleXY { double x; double y; }; struct SimpleXyLink { int num_xy; SimpleXY *simpleXyList; }; 

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

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

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

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

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

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

但是,注意(仅限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 } }; 

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

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

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

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

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

如果它是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; } 

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

也就是说,C ++中的free几乎肯定是错误的。 使用new / delete而不是malloc / free

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