乐闻世界logo
搜索文章和话题

unique_ptr::release()是否调用析构函数?

5 个月前提问
3 个月前修改
浏览次数49

1个答案

1

unique_ptr::release() 并不会调用其所管理对象的析构函数。该函数的主要作用是释放 unique_ptr 对象对其所管理的原始指针的所有权,即断开 unique_ptr 对象与其所管理资源之间的联系。在调用 release() 后,unique_ptr 将变为空指针(即不再管理任何资源),而原始指针则会被返回给调用者。由于 unique_ptr 不再管理该原始指针,因此原始指针所指向的对象不会被自动释放或销毁,这意味着管理该资源的责任转移给了调用者。

举个例子:

cpp
#include <iostream> #include <memory> class Test { public: Test() { std::cout << "Test Constructor\n"; } ~Test() { std::cout << "Test Destructor\n"; } }; int main() { std::unique_ptr<Test> ptr = std::make_unique<Test>(); // 输出: // Test Constructor Test* raw_ptr = ptr.release(); // 此时 ptr 为空,它不再管理 Test 对象 // Test 对象没有被销毁,因此不会调用析构函数 // 必须手动删除 raw_ptr 指向的对象以防止内存泄漏 delete raw_ptr; // 输出: // Test Destructor return 0; }

在这个例子中,当调用 ptr.release() 后,unique_ptr 放弃了对 Test 对象的管理权,且该对象不会被销毁直到我们手动调用 delete。如果忘记手动删除,会导致内存泄漏。这正说明了 release() 函数本身不会导致析构函数的调用。

2024年7月9日 13:45 回复

你的答案