默认情况下,std::unique_ptr可以被初始化为一个空指针。这意味着它不会指向任何对象,也不会管理任何内存。 cpp std::unique_ptr<int> ptr; // 默认初始化,ptr为空指针 3. 使用std::make_unique进行初始化 std::make_unique是C++14引入的一个便捷函数,用于创建并初始化一个std::unique_ptr。使用...
std::unique_ptr<int> uptr(new int(10)); // 2.C++ 14 使用 std::make_unique std::unique_ptr<int> uptr = std::make_unique<int>(10); std::unique_ptr<MyClass> uptr = std::make_unique<MyClass>(); // 3.转移所有权 int* raw_ptr = new int(10); std::unique_ptr<int> uptr(r...
std::cout << "ptr1 is empty" << std::endl; } //检查unique_ptr对象是否为空 if (ptr1 == nullptr) { std::cout << "ptr1 is empty" << std::endl; } //不能通过赋值初始化创建unique_ptr对象 //std::unique_ptr<Task> taskPtr2 = new Task(); //编译错误 ...
作为对 std::auto_ptr 的改进,std::unique_ptr 对其持有的堆内存具有唯一拥有权,也就是 std::unique_ptr 不可以拷贝或赋值给其他对象,其拥有的堆内存仅自己独占,std::unique_ptr 对象销毁时会释放其持有的堆内存。 可以使用以下方式初始化一个 std::unique_ptr 对象: int main() { //初始化方式1 std::...
std::shared_ptr<int> sp(newint[10], [](int*p) {delete[] p; }); 实际上,除非需要共享目标,否则unique_ptr更适合使用数组: std::unique_ptr<int[]> up(newint[10]);//this will correctly call delete[] ps,上面代码可以正确的分配空间,但是空间内的值都没有初始化。如果需要默认初始化为0,可以...
一、原则 使用std::unique_ptr管理具备专属所有权的资源 二、常见用法 std::unique_ptr的一个常见用法是在对象继承谱系中作为工厂函数的返回型别。这种...
使用std::make_unique创建对象,并将其初始化为std::unique_ptr。 4. 赋值操作 std::unique_ptr禁用了复制构造函数和赋值运算符,这是因为它的设计目标是提供独占所有权语义,这与赋值语义冲突。这意味着每个std::unique_ptr实例都是独一无二的,不能与其他std::unique_ptr实例共享所有权。
this指针初始化多个share_ptr也是一样的错误,因为那多个share_ptr都指向一样的对象,但没有关联,它们引用计数都是1,会发生重复析构,所以要用share_from_this()返回。 对于unique_ptr intmain(){std::unique_ptr<A>sp1;A*p=newA(1);sp1.reset(p);sp1.reset(newA(2));//sp1原来指向的A(1)会析构std::...
(std::unique_ptr<box> sp) { std::unique_ptr<A> o = sp->get_o(); if(const B *ptr1 = dynamic_cast<const B*>(o.get())) std::cout << ptr1->get_b0() << std::endl; if(const B *ptr = dynamic_cast<const B*>(sp->get_o().get())) std::cout << ptr->get_b0()...
// std::unique_ptr<MyClass> ptr2 = ptr1; // 编译错误 // 可以移动unique_ptr std::unique_ptr<MyClass> ptr2 = std::move(ptr1); // ptr1现在为空 if(ptr1 ==nullptr) { std::cout <<"ptr1 is null\n"; } // ptr2现在拥有对象 ...