如果我必须使用line 2而不是它有意义(使用line 2也可以,但我们不需要这样做)。 我知道C ++ 0x允许此异常,unique_ptr因为返回值是一个临时对象,一旦函数退出就会被销毁,从而保证返回指针的唯一性。我很好奇这是如何实现的,它是在编译器中特殊的,还是在语言规范中有一些其他条款可以利用?慕桂英4014372 浏览1719回...
这意味着函数可以像其他数据类型一样被传递、作为参数传递给其他函数,也可以作为返回值返回。
7.不可以对unique_ptr进行拷贝、赋值等操作,但是可以通过release函数在unique_ptr之间转移控制权。 8.unique_ptr可以作为函数的返回值和参数使用。 9.unique_ptr同样可以设置deleter,需要在模板参数中指定deleter的类型。 10.weak_ptr一般和shared_ptr配合使用。它可以指向shared_ptr所指向的对象,但是却不增加对象的引用...
如果我不得不使用 2 行,那就有意义(使用 2 行也可以,但我们不需要这样做)。 我知道 C++0x 允许 unique_ptr 这个异常,因为返回值是一个临时对象,一旦函数退出就会被销毁,从而保证返回指针的唯一性。我很好奇这是如何实现的,它在编译器中是特殊情况还是语言规范中是否有其他条款可以利用? 原文由 Praetorian ...
返回值为unique_ptrint main(){ auto createUPtr = [](int i) -> unique_ptr<Person>{ unique_ptr<Person> uPtr = make_unique<Person>(i); return uPtr; }; unique_ptr<Person> uPtr = createUPtr(100); uPtr->getAge(); // 用作链式函数 createUPtr(200)->getAge(); cout << endl << "...
原因:get()函数得到的是共享对象的地址,是内置指针,指向智能指针管理的对象,而智能指针不仅仅包含地址,两个东西不是一个类型的,也不能彼此包含,因此不能这样做。同样,把get()返回值 绑定到智能指针上也是错误的 如下: shared_ptr<int>p(newint(22));int*q=p.get();//语义没问题{shared_ptr<int>(q);...
*** 作为返回值 unique_ptr可以作为参数返回: std::unique_ptr<int>test(inti){returnstd::unique_ptr<int>(newint(i));//这里是因为按右值返回,所以和按左值直接当函数参数传递不同(左值会释放对象)。}intmain(){std::unique_ptr<int>up=test(10);//std::shared_ptr<int> up = test(10);std::...
从函数返回对中的unique_ptr后出现分段错误 是由于悬空指针的问题导致的。悬空指针是指指向已经释放或者无效的内存地址的指针。当函数返回一个unique_ptr时,如果在函数内部使用了move语义将unique_ptr的所有权转移给了返回值,那么原来的unique_ptr就会变成悬空指针。 悬空指针的出现会导致访问无效的内存地址,从而引...
如果不进行返回值优化。那么上面返回unique_ptr会不会有问题呢?也不会。由于标准同意编译器这么做: 1.假设支持move构造,那么调用move构造。 2.假设不支持move。那就调用copy构造。 3.假设不支持copy,那就报错吧。 显然的。unique_ptr是支持move构造的,unique_ptr对象能够被函数返回。
(3)不要用this指针构造shared_ptr作为返回值 classA{public:shared_ptr<A>get_self(){returnshared_ptr<A>(this); } ~A() { cout << ("destructor") << endl; } };intmain(){shared_ptr<A>p1(newA); shared_ptr<A> p2 = p1->get_self();return0; ...