1.1 unique_ptr 参考:https://zh.cppreference.com/w/cpp/memory/unique_ptr std::unique_ptr是通过指针占有并管理另一对象,并在unique_ptr离开作用域时释放该对象的智能指针 在下列两者之一发生时用关联的删除器释放对象: 销毁了管理的unique_ptr对象 通过operator=或reset()赋值另一指针给管理的unique_ptr对象。
1.1 unique_ptr 参考:https://zh.cppreference.com/w/cpp/memory/unique_ptr std::unique_ptr是通过指针占有并管理另一对象,并在unique_ptr离开作用域时释放该对象的智能指针 在下列两者之一发生时用关联的删除器释放对象: 销毁了管理的unique_ptr对象 通过operator=或reset()赋值另一指针给管理的unique_ptr对象。
1) 构造不拥有对象的 std::unique_ptr。值初始化存储的指针和存储的删除器。要求 Deleter 可默认构造 (DefaultConstructible) 且构造不抛异常。这些重载只有在 std::is_default_constructible<Deleter>::value 为true 且Deleter 不是指针类型时才会参与重载决议。
#include <iostream> #include <memory> int main() { std::unique_ptr<int> ptr(new int(42)); if (ptr) std::cout << "重置前,ptr 为: " << *ptr << '\n'; ptr.reset(); ptr ? (std::cout << "重置后,ptr 为: " << *ptr) : (std::cout << "重置后 ptr 为空") << '\...
按理说shared_ptr.reset的时候需要deleteptr 就需要 ptr 的类型(错了请指正),而shared_ptr的 template type 可以是 incomplete type(错误请指正)。cppreference 是这么描述的: std::shared_ptrmay be used with an incomplete typeT. However, the constructor from a raw pointer (template shared_ptr(Y)) an...
按理说shared_ptr.reset的时候需要deleteptr 就需要 ptr 的类型(错了请指正),而shared_ptr的 template type 可以是 incomplete type(错误请指正)。cppreference 是这么描述的: std::shared_ptrmay be used with an incomplete typeT. However, the constructor from a raw pointer (template shared_ptr(Y)) an...
unique_ptr是一个模板类,其拥有两个模板参数,第一个参数是该对象持有指针指向的类型,第二个参数是删除器的类型。 unique_ptr有两个版本,第一个版本是默认的管理单个对象的版本,第二个版本是通过偏特化实现的管理动态分配的数组的版本。在cppreference网站上这个模板类的声明是这个样子: ...
这本质是个量变引起质变的过程。对shared_ptr来说,除了封装的raw_ptr外还要保存ref_cnt和weak_cnt,...
Run this code #include <iomanip>#include <iostream>#include <memory>#include <string>#include <utility>classRes{std::strings;public:Res(std::stringarg):s{std::move(arg)}{std::cout<<"Res::Res("<<std::quoted(s)<<");\n";}~Res(){std::cout<<"Res::~Res();\n";}private:friend...
例子(改自 cppreference.com) #include <iostream> #include <memory> struct Foo { Foo() { std::cout << "Foo\n"; } ~Foo() { std::cout << "~Foo\n"; } }; int main() { std::unique_ptr<Foo> p1; { std::cout << "Creating new Foo...\n"; ...