2011-01-13 119 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; 
}