2011-01-13 65 views
0

我有兩個結構如何釋放與指針的結構的內存到另一個結構

struct SimpleXY 
{ 
    double x; 
    double y; 

}; 

    struct SimpleXyLink 
    { 
      int num_xy; 
      SimpleXY *simpleXyList; 
    }; 

我不知道什麼是SimplyXyLink釋放內存保持正確的方法是什麼?我目前使用

void Free(SimpleXyLink *myList) 
{ 

    free(myList->simpleXyList); 
} 

但我認爲這是錯誤的,因爲它不釋放的simpleXyList的元素中的記憶。

+0

您標記這個`C++`但使用`free`(大概`malloc`)您是指用這個`c`來代替? – KitsuneYMG 2011-01-13 14:02:58

+0

@KitsuneTYMG,我想任何一個都可以。但無論如何,我已將標籤更改爲`c` – Graviton 2011-01-13 14:03:44

+0

就像你從答案中可以看到的那樣,如果你標記爲'C++`並且使用'free',人們會對你想要的感到困惑。儘管`free`在C++編譯器中工作正常,但在C++中分配的方式是``new` – KitsuneYMG 2011-01-13 14:06:57

回答

4

首先,你不釋放內存是SimpleXy * 鏈接 * myList,而不是simpleXyList裏面的內存(你釋放由就好簡稱內存)。

一般情況下,您需要找出一種方法來釋放您正在使用的所有內存。在一般情況下,你會釋放引用它,因爲在結構之前參照的數據:(僅C++)

void FreeSimpleXy(SimpleXyLink *myList) { 
    free(myList->simpleXyList); 
    free(myList); 
} 

但是請注意,如果你使用的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 library來使用它們。

struct SimpleXyLink { 
    int num_xy; 
    boost::scoped_ptr<SimpleXyList> simpleXyList; // or shared_ptr 
}; 

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

0

這完全取決於你如何分配內存。釋放內存總是要回應分配。

也就是說,free在C++中幾乎肯定是錯誤的。使用new/delete而不是malloc/free。另外,好像你爲幾個元素分配內存(至少名稱爲…List意味着這一點),所以你最好使用C++容器結構,比如vectorlist

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; 
} 
相關問題