在将智能指针作为函数参数或返回值时,有一些注意事项: 传递方式:智能指针可以通过值传递、按引用传递或按常量引用传递。选择传递方式时要考虑所有权的转移和拷贝开销。 所有权传递:如果函数需要获取指针的所有权,可以使用std::unique_ptr。这确保了在函数内部对资源的独占访问,避免了多个所有者的问题。 共享所有权:如...
unique_ptr可以作为函数的返回值,如下的代码: structResource{...};std::unique_ptr<Resource>createResource(){returnstd::make_unique<Resource>();}intmain(){autoptr{createResource()};...return0;} 可以看到unique_ptr作为值在createResource()函数中返回,并在main()函数中通过"Move"语义将所有权转移给pt...
测试unique_ptr作为参数和返回值 unique_ptr是可以作为参数和返回值的,不过因为operator=不允许使用,所以在作为参数的时候需要使用函数std::move(),但是作为返回值却不需要,这里留个疑问,最后分析一下: void test3_inner1(unique_ptr<Example> ptr3_1) { ptr3_1->test_print(); // in test print: number ...
read()调用完成后,返回了一个unique_ptr指针,指向T类的对象,这个时候相当于这个对象的所有权转移到了main函数中; 之后调用getPayLoad获取了T里面生成的vector对象指针保存到了data中 这句话结束后,T对象这个时候并没有一个指针拥有它的所有权了,所以内存回收机制会把这段内存给回收了,也就是T对象里面创建的vector...
从函数返回unique_ptr unique_ptr<T>不允许复制构造,而是支持移动语义。然而,我可以unique_ptr<T>从函数返回一个并将返回的值赋给变量。 #include <iostream>#include <memory>using namespace std;unique_ptr<int> foo(){ unique_ptr<int> p( new int(10) ); return p; // 1 //return move( p );...
//因为在函数内部的unique_ptr指针随着作用域的结束会自动销毁,因此可以将其作为返回值,然后将内存传递给另一个unique_ptr指针管理 unique_ptr<int>clone(intp) { returnunique_ptr<int>(newint(p)); } /*unique_ptr<int> clone(int p) { unique_ptr<int> ret(new int(p)); ...
为确保只能有一个unique_ptr拥有内存资源,std::unique_ptr是不允许拷贝的。可以通过移动来将所有权从一个unique_ptr转移给另一个unique_ptr,这也是在将 unique_ptr 作为参数传递和作为返回值返回时用到的方法。 在函数中,移动可以通过以值形式返回std::unique_ptr的方式来实现,也可以像下面这样显式实现: ...
但是,unique_ptr可以作为函数的返回值: unique_ptr<Investment> GetPtr(); //function getthe unique pointer unique_ptr<Investment> pInv = GetPtr(); // ok 二、自定义释放器 用如下方式使用带自定义资源释放的unique_ptr auto delete_Investment = [](Investment* pInv) ...
函数的返回值也是同样的道理。 2当表示所有权的转移时,用unique_ptr作为函数参数。 Guideline: Don’t pass a smart pointer as a function parameter unless you want to use or manipulate the smart pointer itself, such as to share or transfer ownership. ...
智能指针(shared_ptr,unique_ptr)作为函数参数或者返回值时 的⼀些注意事项 智能指针(shared_ptr,unique_ptr)作为函数参数或者返回值时的⼀些注意事项 当智能指针作为函数的参数或者返回值时,⼀直在纠结到底是⽤智能指针对象本⾝还是⽤原始指针。Herb Sutter⼤师的⽂章很好的解决了这个疑惑,参见⽹址...