[英]Correct way to free memory for a structure that contains allocated memory referenced by pointers
[英]How to Free Memory of A Structure with Pointers to another Structure
我有兩個結構
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
,而不是simpleXyList內部的內存(您可以釋放由它引用的內存就可以了)。
通常,由您自己決定一種釋放所有正在使用的內存的方法。 通常,您將在引用數據之前釋放引用的數據,如下所示:
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> simpleXyList; // or shared_ptr
};
這些將消除編寫析構函數的需要(但是您仍然必須使用new
和delete
!),但是它們也帶有其他限制。 使用前請仔細閱讀我仔細鏈接的文檔,如果不確定,請隨時提出另一個問題。
如果是C ++(在這里我很困惑,因為您使用free :-))
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
)可能會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.