C++11引入了智能指针,它们是处理动态内存分配和避免内存泄漏的重要工具。智能指针的几种创新用法包括:
-
自定义删除器:智能指针允许用户指定一个删除器来释放资源,而不是默认的
delete操作符。这在管理非堆内存(如文件句柄或网络连接)时非常有用。std::unique_ptr<FILE, decltype(&pclose)> filePtr(popen("command", "r"), pclose); -
std::shared_ptr的弱引用:std::weak_ptr是为了配合std::shared_ptr而设计的,它允许观察共享对象而不增加其引用计数。这可以防止循环引用导致的内存泄漏。std::shared_ptr<MyClass> sharedPtr = std::make_shared<MyClass>(); std::weak_ptr<MyClass> weakPtr = sharedPtr; if (auto lockedPtr = weakPtr.lock()) { // 使用lockedPtr } else { // sharedPtr已经被销毁 } -
std::shared_ptr与std::enable_shared_from_this:通过std::enable_shared_from_this,对象可以在其内部创建自己的std::shared_ptr副本,从而避免在多线程环境下的引用计数竞争。class MyClass : public std::enable_shared_from_this<MyClass> { public: std::shared_ptr<MyClass> getSharedPtr() { return shared_from_this(); } }; -
std::unique_ptr的移动语义:std::unique_ptr支持移动语义,允许资源的所有权从一个智能指针转移到另一个,而不进行复制。std::unique_ptr<int> ptr1 = std::make_unique<int>(42); std::unique_ptr<int> ptr2 = std::move(ptr1); // 所有权转移到ptr2 -
std::unique_ptr与自定义类型:std::unique_ptr可以与自定义删除器一起使用,以支持管理非标准资源。struct CustomDeleter { void operator()(MyCustomType* ptr) const { // 自定义释放资源逻辑 } }; std::unique_ptr<MyCustomType, CustomDeleter> uptr(new MyCustomType(), CustomDeleter()); -
std::shared_ptr的数组版本:虽然标准库中没有直接提供std::shared_ptr的数组版本,但可以通过使用std::make_shared和std::vector来模拟。auto vec = std::make_shared<std::vector<int>>(10); -
std::shared_ptr与std::atomic:在多线程环境中,可以使用std::atomic<std::shared_ptr<T>>来保证对共享指针的安全访问。std::atomic<std::shared_ptr<MyClass>> atomicPtr;
这些创新用法展示了智能指针在C++中的强大功能和灵活性,它们是现代C++编程中不可或缺的工具。

便宜VPS测评









