我有两个结构
struct SimpleXY
{
double x;
double y;
};
struct SimpleXyLink
{
int num_xy;
SimpleXY *simpleXyList;
};
我想知道SimplyXyLink
释放内存的正确方法是什么?我目前正在使用
void Free(SimpleXyLink *myList)
{
free(myList->simpleXyList);
}
但我认为这是错误的,因为它没有释放simpleXyList
元素内的内存。
答案 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。 但,请注意,不得现在使用malloc
和free
- 使用new
和delete
代替:
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
};
这些将消除编写析构函数的需要(但仍然必须使用new
和delete
!),但它们也带有其他限制。在使用之前,请仔细阅读我链接的文档,如果您仍然不确定,请随时打开另一个问题。
答案 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
。