删除c风格的int向量数组

deleting c-style array of int vectors

本文关键字:向量 数组 int 风格 删除      更新时间:2023-10-16

我已经声明:

vector<int> * part = new vector<int>[indmap];

好的,我知道了:"为什么不声明一个向量的向量?"下次我会这样做,但现在我想了解更多关于向量的东西,我不能解决。

现在我想释放所有的资源,我该怎么做?

delete[] part;  

但是在删除数组之前,我应该做些什么来删除所有的向量对象?

不,你没有。只有一个简单的规则(当你使用智能指针时)- 在使用new时使用delete

所以,这里只有一个new[],你只需要一个delete[]

@Joachim Pileborg是对的,但是你会有更多的new -s,所以,你需要更多的delete -s。

这取决于vector的内容。如果它包含原始指针(如int *),则需要迭代向量并手动删除所有条目。否则,如果它只包含基本类型、对象(不是指向对象的指针)或智能指针,则会自动处理。

当您使用delete时,在取消分配之前调用指向对象的析构函数(当您使用new创建对象时执行此操作)。

同样,当您使用数组版本delete[](当您使用new[]分配了一个对象数组时,请执行此操作)时,将调用所有创建对象的析构函数。

std::vector<T>的析构函数自动调用所包含对象的析构函数。

因此,正如Joachim Pileborg在他的回答中指出的那样,您需要手动删除向量的对象,只有当您有指向动态分配对象的原始指针(例如,由new分配的对象)并且您负责删除它们(即,您拥有它们)时。原始指针没有销毁被指向对象的析构函数,因此在这种情况下,您必须迭代vector以手动删除对象。否则,只需销毁vector对象(在本例中为删除数组)。

根据经验:

  • 您需要使用new分配的delete内存。
  • 您需要使用new[]分配的delete[]内存。
  • 你可以将此义务传递给智能指针,即实现所有权策略的对象,该策略将负责适当的回收。
  • 你应该尽可能避免动态内存分配,而选择像RAII这样的内存管理方案。
参考:

  • http://en.cppreference.com/w/cpp/memory/new/operator_new
  • http://en.cppreference.com/w/cpp/memory/new/operator_delete
  • <
  • http://en.cppreference.com/w/cpp/container/vector/向量/gh>
  • 什么是智能指针,什么时候我应该使用一个?
  • https://en.wikipedia.org/wiki/RAII