动态分配带有向量的结构

Dynamically allocating structures with vectors in them

本文关键字:结构 向量 动态分配      更新时间:2023-10-16

如果我有一个动态分配的结构体,其中有一个向量,向量何时超出作用域?当我删除结构时是否会调用vector析构函数,或者我是否需要在删除结构之前强制调用析构函数?

当您动态分配结构体时,您也分配了其中的所有内容。当结构被删除时,该结构及其中的所有内容都会被销毁。编译器会注意确保调用所有析构函数。

你可能想太多了。当你销毁任何对象时,所有成员对象都被自动销毁。

struct Foo
{
  Bar x;
  std::vector<int> y;
};
int main()
{
  Foo a;
  Foo * p(new Foo);
  delete p; // #2
} // #1

在点#1,a超出作用域,因此它被销毁。这包括破坏a.ya.x(按此顺序),同样的,在#2中破坏*pp->x/p->yFoo对象是自动分配的(如#1)还是动态分配的(如#2)是无关紧要的;

在删除struct之前,vector将一直存在

struct Foo
{
   std::vector<int> X;
}

在上面的例子中,delete f也会释放vector

Foo* f = new Foo();
delete f;

如果你的Foo是这样定义的…你需要提供析构函数。

struct Foo
{
   std::vector<int> *X;
   Foo()
   { 
       X = new std::vector<int> ();
   }
   ~Foo()
   {
      delete X;
   }
}

您可以从这两种方法中任选一种。最好的方法是使用shared_ptr,这样即使

也不必担心删除结构体。