c++ - C+ + - 指向数组的unique_ptr会在调用release之后自动释放动态内存?

58 2

据我所知,调用std::unique_ptr<T,Deleter>::release仅转移所有权,不会释放动态内存。

来自C++ Primer第五篇:


p2.release(); // WRONG: p2 won't free the memory and we've lost the pointer


auto p = p2.release(); // ok, but we must remember to delete(p)



但几页之后,它写道:

库提供了unique_ptr的一个版本,该版本可以管理由new分配的数组。 要使用unique_ptr来管理动态数组,必须在对象类型之后包括一对空括号,


// up points to an array of ten uninitialized ints


unique_ptr<int[]> up(new int[10]);


up.release(); // automatically uses delete[] to destroy its pointer



类型说明符(<int[]> )中的括号表示up指向的不是int,而是int数组,因为指向一个数组,当破坏它管理的指针时,它将自动使用delete[]。

std::unique_ptr<T,Deleter>::releas以不同的方式处理动态分配的数组,这将在调用release()后,自动释放分配的内存? 如果是真的,那么它也表明不能转让动态数组的所有权,目前在网上找不到权威的参考资料。

时间: 原作者:

143 2

我查看了一下,我想这只是作者的一个错误,cppreference com并未引用release的数组特化 .为了确保这一点,我检查了libc++实现的源代码, 这是实现 std::unique_ptr<T[], Deleter>::release如你所见,它不调用delete[],我猜作者是打算写成up.reset();的,这会释放内存。

原作者:
104 5

// up points to an array of ten uninitialized ints


unique_ptr<int[]> up(new int[10]);


up.release(); // automatically uses delete[] to destroy its pointer



不正确delete[] ,它只是释放数组的所有权并返回指向它的指针,因此,coder 负责调用delete[]。

我觉得你搞混淆了, 和 std::unique_ptr<T, Deleter>::reset()当没有参数时,释放分配的内存。

演示:


#include <iostream>


#include <memory>



class Test


{


public:


 Test() { std::cout <<"Test()" << std::endl; }


 ~Test() { std::cout <<"~Test()" << std::endl; }


};



int main()


{


 std::unique_ptr<Test[]> up(new Test[3]);


 auto ptr = up.release();



 return 0;


}



输出:


Test()


Test()


Test()



不调用析构函数,内存泄漏!避免这种情况的唯一方法是调用delete [] ptr; auto ptr = up.release();

原作者:
...