【问题标题】:The proper way to free memory in an array that holds pointers to objects在包含指向对象的指针的数组中释放内存的正确方法
【发布时间】:2014-01-30 15:04:00
【问题描述】:

假设我有数组:

Geometry* shapes[MAX_SIZE];

然后我像这样填充数组:

for (int i = 0; i < MAX_SIZE; ++i)
{
    shapes[i] = new Geometry;
}

delete [] shapes; 会完成这项工作,否则我必须遍历数组并一一删除:

for (int i = 0; i < MAX_SIZE; ++i)
{
    delete shapes[i];
}

我认为我必须单独循环和删除每个指针,因为 delete [] 调用数组中对象的析构函数,这并不意味着内存将被释放。但我需要更有经验的人确认。

【问题讨论】:

  • 正确的方法是使用std::unique_ptr&lt;Geometry&gt; shapes[MAX_SIZE],不用做任何事情。但在你的情况下,你需要第二个。

标签: c++ pointers memory free delete-operator


【解决方案1】:

你有一个简单的指针数组。每个指针都指向一个单独的动态分配的Geometry。所以你需要在每个指针中调用deletedelete [] 用于动态分配的数组。

在现实生活中,您会使用自动管理资源的类型,以避免手动删除指针。选项包括std::unique_ptr&lt;Geometry&gt; 的数组,或旨在管理动态分配对象的容器,例如boost::pointer_container 库中提供的那些。

【讨论】:

    【解决方案2】:

    循环遍历数组,逐一删除。

    数组本身好像是静态分配的,所以不需要删除。

    事实上,如果你尝试delete[] shapes,那么你可能会得到一个运行时异常。

    【讨论】:

      【解决方案3】:

      正如 juanchopanza 所说...

      采用托管指针数组或 boost::pointer_container。我为自己做的测试表明,pointer_container 更快

       time elapsed for 1000 adds: 
            0 ms     364 us when using std::vector<boost::shared_ptr<Foo> >
            0 ms     205 us when using boost::ptr_vector<Foo>
       time elapsed for 10000 adds: 
            3 ms    3979 us when using std::vector<boost::shared_ptr<Foo> >
            2 ms    2195 us when using boost::ptr_vector<Foo>
       time elapsed for 100000 adds: 
           39 ms   39514 us when using std::vector<boost::shared_ptr<Foo> >
           21 ms   21365 us when using boost::ptr_vector<Foo>
       time elapsed for 1000000 adds: 
          363 ms  363687 us when using std::vector<boost::shared_ptr<Foo> >
          206 ms  206395 us when using boost::ptr_vector<Foo>
       time elapsed for 10000000 adds: 
         3887 ms 3887172 us when using std::vector<boost::shared_ptr<Foo> >
         2084 ms 2084816 us when using boost::ptr_vector<Foo>
      

      至少对于矢量变体。它认为数组也值得一试

      【讨论】:

        【解决方案4】:

        如果您可以使用C++11,请查看新的memory library

        您可以将标准 C++ 指针更改为以下之一:

        或者其他的。那么你就不需要记住动态声明的释放对象了

        【讨论】:

          【解决方案5】:

          四个答案,没人提到

          std::unique_ptr<Geometry[]> shapes(new Geometry[MAX_SIZE]);
          

          数组特化 std::unique_ptr&lt;T[]&gt; 是你想要的。

          编辑:哎呀,我误读了这个问题,才意识到你需要一个指针数组而不仅仅是一个数组。我会在这里留下这个答案,以防有人可以使用它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-07-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多