Динамическое размещение структур с векторами в них - PullRequest
0 голосов
/ 10 ноября 2011

Если у меня есть динамически размещенная структура с вектором, когда вектор выходит из области видимости?Будет ли вызываться векторный деструктор при удалении структуры или мне нужно принудительно вызвать вызов деструктора перед удалением структуры?

Ответы [ 3 ]

2 голосов
/ 10 ноября 2011

Когда вы динамически распределяете структуру, вы также распределяете все внутри нее.Структура и все в ней разрушается при удалении структуры.Компилятор позаботится о том, чтобы все деструкторы были вызваны.

0 голосов
/ 10 ноября 2011

Возможно, вы слишком много думаете. Когда вы уничтожаете любой объект, все объекты-члены автоматически уничтожаются.

struct Foo
{
  Bar x;
  std::vector<int> y;
};

int main()
{
  Foo a;
  Foo * p(new Foo);
  delete p; // #2
} // #1

В точке # 1, a выходит из области видимости, поэтому он уничтожается. Это включает в себя уничтожение a.y и a.x (в этом порядке) и то же самое для уничтожения *p и p->x / p->y в # 2. Независимо от того, был ли объект Foo размещен автоматически (как в # 1) или динамически (как в # 2), не имеет значения; все члены очищаются должным образом.

0 голосов
/ 10 ноября 2011

Вектор будет оставаться живым, пока вы не удалите свою структуру

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 , чтобы вам не пришлось беспокоиться об удалении структуры даже

...