动态分配带有向量的结构

时间:2011-11-10 01:12:28

标签: c++ dynamic vector new-operator delete-operator

如果我有一个带有向量的动态分配结构,那么向量何时超出范围?在删除结构时是否会调用向量析构函数,还是在删除结构之前需要强制执行析构函数调用?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

在您删除结构

之前,向量将保持活动状态
struct Foo
{
   std::vector<int> X;
}

在上述情况下,删除f也将释放向量。

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

如果您的 Foo 定义如此..您需要提供析构函数。

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

   ~Foo()
   {
      delete X;
   }
}

您可以从两种方法中选择一种。最好的方法是使用 shared_ptr ,这样您就不用担心删除结构了

答案 2 :(得分:0)

你可能会过分思考。当您销毁任何对象时,会自动销毁所有成员对象。

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)是无关紧要的;所有成员都得到了适当的清理。