Сброс сброса вызова на общем умном указателе - PullRequest
0 голосов
/ 21 мая 2018

Я недавно изменил свой необработанный указатель на использование std::shared_ptr в контейнере, подобном этому:

std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths;

Когда я вызову clear() для этого контейнера, будет ли он вызывать reset() метод для каждого std::shared_ptr в нем?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Нет, это вызовет деструкторы.Деструкторы уменьшают счетчик ссылок для каждого умного указателя, если он приводит к 0, то деструктор вызывает свободную функцию (по умолчанию это - обертка удаления).Так что если вы сделали что-то вроде:

std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths ({c1, std::shared_ptr<AbstractPathContainer>(new AbstractPathContainerImpl())  });
std::shared_ptr<AbstractPathContainer> smartRef = mGeneratedPaths[0];
 mGeneratedPaths.clear();

smartRef не будут удалены из кучи.

0 голосов
/ 21 мая 2018

Нет;он будет вызывать деструктор для каждого указателя (который может вызывать или не вызывать reset()).

Если ваш вопрос действительно "освободит ли моя память, если необходимо?"тогда ответ - да;количество ссылок будет корректироваться в соответствии с требованиями для каждого общего объекта ptr, и если оно равно 0, объект будет удален.

...