Удалить объекты, созданные при построении объекта? - PullRequest
1 голос
/ 12 июля 2020

Если объекты создаются во время построения класса, например:

class MyClass
{
private:
  std::vector < MyObject*> MyObjects = { new MyObject };
...

Нужно ли мне удалять объекты в векторе во время деструктора?

1 Ответ

2 голосов
/ 12 июля 2020

Да, std::vector < MyObject*> MyObjects содержит указатели на объекты. Вектор предполагает, что ему не принадлежат объекты, поэтому он не удаляет их по умолчанию.

Если вы хотите, чтобы объекты уничтожались автоматически, либо измените тип:

std::vector <std::unique_ptr<MyObject>> MyObjects

Или, удалите все указатели в:

  1. деструкторе
  2. операторе присваивания
  3. в конструкторах, в случае исключения. Если есть исключение, то без обработки часть вектора будет заполнена объектами. За исключением случаев, указатели не удаляются, если они не обрабатываются явным образом.

Использование std::unique_ptr обычно является предпочтительным решением, так как оно гарантирует, что память будет освобождена. Но это происходит за счет отсутствия конструктора присваивания / копирования по умолчанию. Вы либо живете без присваивания / копирования, остаетесь только с семантикой перемещения, либо должны явно определять присваивание / копирование. Но это небольшая цена, поскольку с простыми указателями вам все равно придется определять присваивание / копирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...