#c #c 11 #memory-leaks #smart-pointers #unique-ptr
#c #c 11 #утечки памяти #интеллектуальные указатели #уникальный-ptr
Вопрос:
Меня немного смущает метод освобождения уникального указателя. Вот мой пример программы.
class Test
{
public:
Test(){std::cout << "ctor" << std::endl;}
~Test(){std::cout << "dtor" << std::endl;}
};
int main() {
std::unique_ptr<Test> ptr(new Test());
ptr.release(); // memory leak
//ptr.reset(); // this is ok but not necessary
return 0;
}
Вывод:
ctor
Поскольку он не печатается, dtor
я предполагаю, что он не вызывает деструктор Test
, что приведет к утечке памяти. Это?
Комментарии:
1. FWIW, поскольку вы используете
unique_ptr
, в вашем примере кода деструктор будет вызван вообще без каких-либо действий, когдаmain()
возвращается — нет необходимости вreset
,release
илиdelete
(которые не будут компилироваться сunique_ptr
)
Ответ №1:
Это слово release
означает «передать право собственности вызывающей стороне». Итак, нет, деструктор не вызывается им.
Если вы хотите вызвать деструктор явно, то вам придется либо delete
release
использовать общий указатель вручную, либо просто вызвать reset
, что является предпочтительным способом сделать это.
Если вам не нужно делать это явно, вы можете просто оставить это, и об этом позаботятся автоматически.
Комментарии:
1. значит, произойдет утечка памяти, если я вызову release, как в приведенном выше примере?
2. @dream_machine: Да.
3. dream_machine, вероятно, думает о COM, где
release()
означает уменьшение количества ссылок и потенциальное уничтожение объекта.4. на самом деле я запутался со словом release, которое обычно используется для освобождения ресурсов 🙂
5. Не забывайте, что unique_ptr — это интеллектуальный указатель. Он также будет уничтожен, а память освобождена, когда он выйдет за пределы области видимости, если вы ничего не предпримете.