在包含指向对象的指针的数组中释放内存的正确方法

时间:2014-01-30 15:04:01

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

假设我有阵列:

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 []调用数组中对象的析构函数,这并不意味着将释放内存。但我需要更有经验的人的确认。

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

循环遍历数组并逐个删除项目。

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

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

答案 2 :(得分:1)

正如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>

至少对于载体变体。它认为值得尝试阵列

答案 3 :(得分:0)

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

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

或者从那里开始。然后你不需要记住释放动态声明的对象

答案 4 :(得分:0)

四个答案,没有人提到

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

阵列特化std::unique_ptr<T[]>就是你想要的。

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