在数组中自由记忆的适当方法,该数组将指针固定在对象上

The proper way to free memory in an array that holds pointers to objects

本文关键字:数组 指针 对象 方法 自由 记忆      更新时间:2023-10-16

假设我有数组:

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];
}

我认为我必须循环并单独删除每个指针,因为删除[]调用数组中对象的破坏者,这并不意味着内存将被释放。但是我需要经验丰富的人的确认。

您有一系列普通的指针。每个指针都指向动态分配的个体Geometry。因此,您需要在每个指针中调用deletedelete []用于动态分配的数组。

在现实生活中,您将使用自动管理资源的类型,以免手动删除指针。选项包括std::unique_ptr<Geometry>的数组,或旨在管理动态分配的对象的容器,例如boost::pointer_container库中可用的对象。

通过数组循环循环,然后一一删除项目。

数组本身似乎是静态分配的,因此您无需删除它。

实际上,如果您尝试使用delete[] shapes,则可能会得到运行时例外。

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>

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

如果您可以使用C++11查看新内存库。

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

之一
  • unique_ptr
  • shared_ptr
  • feek_ptr

或从那里的其他。那么,您无需记住动态声明的释放对象

四个答案,没有人提到

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

数组专业std::unique_ptr<T[]>是您想要的。

编辑:糟糕,我误读了这个问题,只是意识到您需要一系列指针,而不仅仅是一个数组。我将在这里留下这个答案,以防有人可以使用。