void doSomething(std::unique_ptr<MyClass> a, std::unique_ptr<MyClass> b); // 可能不安全,如果第一个new抛出异常,则第二个new就不会执行,导致第一个new分配的内存泄漏 doSomething(std::unique_ptr<MyClass>(new MyClass()), std::unique_ptr<MyCl
std::unique_ptr 的独占所有权意味着它不能被复制,但我们可以通过移动语义将所有权转移给另一个 std::unique_ptr。#include<iostream> #include<memory> voidprocess%28std::unique_ptr<int>p%29{ std::cout<<"Processingvalue:"<<%2Ap<<std::endl; } intmain%28%29{ std::unique_ptr<int>ptr=std::...
voidswap(unique_ptr<T,Deleter>&lhs, unique_ptr<T,Deleter>&rhs)noexcept; (C++11 起) 为std::unique_ptr特化std::swap算法。交换lhs与rhs的指针。调用lhs.swap(rhs)。 此重载仅若std::is_swappable<D>::value为 true 才参与重载决议。 (C++17 起) ...
void example() { std::unique_ptr<int> ptr(new int(10)); // ptr 在此处超出作用域,所管理的 int 对象会被自动销毁 } 显式销毁:可以通过调用 reset() 方法显式销毁 std::unique_ptr 所管理的对象,并将 std::unique_ptr 置为空。 cpp std::unique_ptr<int> ptr(new int(10)...
voiddoSomething(){ std::cout <<"Doing something\n"; } }; intmain(){ // 创建unique_ptr std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); // 使用->访问成员 ptr1->doSomething(); // 无法复制unique_ptr // std::unique_ptr<MyClass> ptr2 = ptr1; // 编译错误 ...
}voidFoo::setName(std::string name){ m_upImpl->name = name; }conststd::string&Foo::getName()constnoexcept{returnm_upImpl->name; } 尽量使用std::make_unique 使用std::make_unique来创建std::unique_ptr智能指针有以下优点: 减少代码重复:从代码std::unique_ptr<Foo> upFoo(new Foo);和auto ...
void customDeleter(int* ptr) {std::cout << "Deleting memory at address: " << ptr << std::endl;delete ptr;}int main() {std::unique_ptr<int, decltype(&customDeleter)> ptr(new int(42), customDeleter);return 0;}移动构造函数:std::unique_ptr<T> ptr1 = std::make_unique<T>(args...
std::unique_ptr<int, std::function<void(int*)>> ptr2 = std::move(ptr); // 使用std::unique_ptr的成员函数操作指针 if (ptr2) { std::cout << "Value: " << *ptr2 << std::endl; } return 0; } 在上述示例中,使用std::function作为std::unique_ptr的删除器类型,它可以包装lam...
void operator()(Foo* p) const { std::cout << "D is deleting a Foo\n"; delete p; }; }; int main() { std::cout << "Example constructor(1)...\n"; std::unique_ptr<Foo> up1; // up1 is empty std::unique_ptr<Foo> up1b(nullptr); // up1b is empty ...
你可以通过将 std::unique_ptr 作为右值引用参数传递给函数,来转移所有权。 void takeOwnership(std::unique_ptr<MyClass>&& myPtr) { // 函数内部拥有了 myPtr 的所有权 } auto myPtr = std::make_unique<MyClass>(args...); //在这种情况下,myPtr 的所有权被传递给了函数 takeOwnership。 takeOwnership...