【问题标题】:How to Free Memory of A Structure with Pointers to another Structure如何使用指向另一个结构的指针释放结构的内存
【发布时间】:2011-01-13 13:57:55
【问题描述】:

我有两个结构

struct SimpleXY
{
    double x;
    double y;

};

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

我想知道释放SimplyXyLink 所持有的内存的正确方法是什么?我目前正在使用

void Free(SimpleXyLink *myList)
{

    free(myList->simpleXyList);
}

但我认为这是错误的,因为它不会释放 simpleXyList 元素内的内存。

【问题讨论】:

  • 你标记了这个c++,但使用的是free(可能是malloc)你是不是要标记这个c
  • @KitsuneTYMG,我认为任何一个都可以。但无论如何,我已经将标签更改为c
  • 正如您从答案中看到的那样,如果您将其标记为c++ 并使用free,人们将会对您想要的东西感到困惑。虽然 free 在 c++ 编译器中工作正常,但在 c++ 中分配的方式是 new

标签: c memory free


【解决方案1】:

首先,您没有释放的内存是 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 library 使用它们。

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

这些将消除编写析构函数的需要(但您仍然必须使用newdelete!),但它们也带有其他限制。使用前请仔细阅读我链接的文档,如果您仍然不确定,请随时提出另一个问题。

【讨论】:

  • 智能指针——有趣!但它只是垃圾收集器在起作用,因此它会继承所有垃圾收集器的问题吗?
  • @Graviton C++ 没有垃圾收集器。
  • 智能指针只是自动化了我向您展示的析构函数——当一个结构被析构时,所有(非指针)成员的析构函数也会被调用。然后scoped_ptr 析构函数删除隐藏在scoped_ptr 中的指针。顺便说一句,实际上有用于 C++ 的垃圾收集器(例如 hpl.hp.com/personal/Hans_Boehm/gc)——但它们的性能往往不如其他旨在为 GC 提供更多有用信息的语言。跨度>
  • 为什么推荐做simpleXyList = NULL; // run when object is created with new
【解决方案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;
}

【讨论】:

    【解决方案3】:

    这完全取决于您如何分配内存。释放内存总是要回显分配。

    也就是说,free 在 C++ 中几乎肯定是错误的。使用new/delete 而不是malloc/free

    此外,您似乎正在为她的几个元素分配内存(至少名称 …List 暗示了这一点)所以您可能最好使用 C++ 容器结构,例如 vector 或 @987654328 @。

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 1970-01-01
      • 2018-09-11
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多