voidrunGame(){std::shared_ptr<Monster>monster1(newMonster());//计数加到1do{std::shared_ptr<Monster> monster2 = monster1;//计数加到2}while(0);//该栈退出后,计数减为1,monster1指向的堆对象仍存在std::shared_ptr<Monster> monster3 = monster1;//计数加到2}//该栈退出后,shared_ptr都释放...
unique_ptr<int> ret =clone(p); cout << *ret <<endl; } 使用举例: {//创建一个指向int的空指针 std::unique_ptr<int>fPtr1; std::unique_ptr<int> fPtr2(newint(4)); auto fPtr3 = std::make_unique<int>();//fPtr2释放指向对象的所有权,并且被置为nullptr std::cout <<"fPtr2 re...
//因为在函数内部的unique_ptr指针随着作用域的结束会自动销毁,因此可以将其作为返回值,然后将内存传递给另一个unique_ptr指针管理 unique_ptr<int> clone(int p) { return unique_ptr<int>(new int(p)); } /*unique_ptr<int> clone(int p) { unique_ptr<int> ret(new int(p)); return ret; }*/...
unique_ptr<int> clone_unique(int a) { return unique_ptr<int>(new int(a)); } void use_uniqueptr() { int a = 1024; unique_ptr<int> mp = clone_unique(a); cout << *mp << endl; } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 删除器 类似shared_ptr,我们可以为unique_ptr指定...
unique_ptr<int> pInt(new int(5)); cout << *pInt; //3、移动 unique_ptr<int> pInt2 = std::move(pInt); // 转移所有权 //4、函数返回unique_ptr unique_ptr不支持拷贝操作,但却有一个例外:可以从函数中返回一个unique_ptr。 unique_ptr<int> clone(int p) ...
本文要讲的是C++11引入的智能指针之std::unique_ptr。 std::unique_ptr系C++11引入的智能指针,拥有资源的唯一所有权,头文件 #include <memory>。 unique_ptr指针指向的堆内存空间的引用计数为 1,如果unique_ptr 指针放弃对所指堆内存空间的所有权,那么该空间会被立即释放回收。 那么,什么时候使用unique_ptr呢...
unique_ptr 独占所指向的对象,与shared_ptr不同的是,某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁。 禁止复制语义存在特例,比如,可以通过函数得到一个std::unique_ptr对象,然后返回给up即可: std::unique_ptr<int>clone(intval){std::unique_ptr<int>p(newint...
unique_ptr<int> ret =clone(p); cout << *ret << endl; } AI代码助手复制代码 unique_ptr使用场景 1、为动态申请的资源提供异常安全保证 我们先来看看下面这一段代码: voidFunc(){int*p =newint(5);// ...(可能会抛出异常)delete p;
{ private: std::unique_ptr<A> o; public: box(const box& sp) { o = sp.o->clone(); } box(std::unique_ptr<A> o) : o(std::move(o)) {} std::unique_ptr<A> get_o() { return o->clone(); } }; void foo(std::unique_ptr<box> sp) { std::unique_ptr<A> o = sp->...
unique_ptr作为参数和返回值 上述对于拷贝的限制,有两个特殊情况,即unique_ptr可以作为函数的返回值和参数使用,这时虽然也有隐含的拷贝存在,但是并非不可行的。 unique_ptr<int> clone(int p) return unique_ptr<int>(new int(p)); void process_unique_ptr(unique_ptr<int> up) ...