簡體   English   中英

如何釋放帶有指向另一個結構的指針的結構的內存

[英]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。 但是 ,請記住,你不能使用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> simpleXyList; // or shared_ptr
};

這些將消除編寫析構函數的需要(但是您仍然必須使用newdelete !),但是它們也帶有其他限制。 使用前請仔細閱讀我仔細鏈接的文檔,如果不確定,請隨時提出另一個問題。

如果是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 ++容器結構(例如vectorlist )可能會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM