2. 移动语义 std::unique_ptr 不支持复制,但支持移动,这样可以转移所有权。 #include <memory> #include <iostream> void example() { std::unique_ptr<int> ptr1(new int(20)); // 移动 ptr1 到 ptr2,ptr1 现在为空 std::unique_ptr<int> ptr2 = std::move(ptr1); if (ptr1) { std::cou...
函数可以返回std::unique_ptr来传递所有权。 由于返回值优化(RVO)或移动语义,这种方式是安全的。 //调用 createMyClass 函数将返回一个 std::unique_ptr<MyClass>std::unique_ptr<MyClass>createMyClass(args...){returnstd::make_unique<MyClass>(args...);} 比如 // 调用 createMyClass 函数将返回一个...
结论1:std:move() 只是将一个实参强行转换为右值引用。 我们知道对象初始化时有构造函数,拷贝构造函数,移动构造函数;其中移动构造函数能够防止拷贝过程,减小性能开销; 1.拷贝构造函数通常使用赋值运算可以触发,如T a=b; 2.而移动构造函数需要使用右值引用来赋值,因此通常需要搭配std:move()使用 T a=std:move(b)...
是一种独占所有权的智能指针,即一个 unique_ptr 拥有对动态分配对象的唯一所有权。unique_ptr 通过移动语义来实现独占所有权,因此不能被复制,只能被移动。当 unique_ptr 被销毁时,它所指向的对象也会被销毁。 下面是 unique_ptr 的简单示例: 编译错误,unique_ptr 不能被复制 ...
支持移动语义:unique_ptr支持移动构造和移动赋值操作,可以将所有权转移给新的unique_ptr,而无需进行内存拷贝。 可自定义删除器:unique_ptr可以通过模板参数来指定一个删除器(deleter)函数对象,用于在释放内存时执行额外的清理操作。 示例代码: 代码语言:javascript ...
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 ); // 2}int main()...
这样的做法实际上是不安全的,除非使用者明确知道自己的意图,因为被移动资源的“老”智能指针内的成员指针已经被置空,再次使用的话会访问到一个nullptr(这里跟惯常的移动语义是相同的,有兴趣可以看一下std::unique_ptr的源码)。 同样的,由于std::unique_ptr是独占的,它的对象是不能通过值传递给...
vec.push_back(std::move(p)); // 使用移动语义 } 1. 2. 3. 4. 5. 6. 4、管理动态数组 标准库提供了一个可以管理动态数组的unique_ptr版本。 int main() { unique_ptr<int[]> p(new int[5] {1, 2, 3, 4, 5}); p[0] = 0; // 重载了operator[] ...
unique_ptr不能被拷贝,但可以通过移动语义转移所有权。 unique_ptr使用时需要注意以下几点: 1. unique_ptr的构造函数可以接受原始指针或者一个std::nullptr_t类型的值作为参数,用于初始化它所管理的对象。 2. unique_ptr的get()函数可以用于获取它所管理的原始指针。 3. unique_ptr的reset()函数可以释放它所管理...