уникальный указатель c : утечка памяти

#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 — это интеллектуальный указатель. Он также будет уничтожен, а память освобождена, когда он выйдет за пределы области видимости, если вы ничего не предпримете.