我有两个结构
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.
首先,你没有释放的内存是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.但是,请记住,你不能使用malloc和free现在-使用new和delete替代:
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但是!),但它们也带有其他限制.在使用之前,请仔细阅读我链接的文档,如果您仍然不确定,请随时打开另一个问题.