如何用指针向另一个结构释放结构的记忆
我有两个结构
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。 但是 ,请记住,您现在不能使用malloc
和free
– 使用new
和delete
代替:
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 };
这些将消除编写析构函数的需要(你仍然必须使用new
并delete
!),但它们也带有其他限制。 在使用之前,请仔细阅读我链接的文档,如果您仍然不确定,请随时打开另一个问题。
如果它是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 ++容器结构,例如vector
或list
。