智能指针是C++中用于管理动态内存的一种机制,它能够帮助我们自动管理内存,避免内存泄漏和空悬指针问题。C++11引入了标准库中的智能指针,包括std::unique_ptr、std::shared_ptr和std::weak_ptr。

  1. std::unique_ptr: std::unique_ptr是一种独占所有权的智能指针,即同一时间只能有一个unique_ptr指向一个对象。当unique_ptr被销毁时,它所管理的资源也会被释放。
#include <memory>

int main() {
    std::unique_ptr<int> ptr(new int(5));
    std::cout << *ptr << std::endl;
    return 0;
}
  1. std::shared_ptr: std::shared_ptr是一种共享所有权的智能指针,可以有多个shared_ptr指向同一个对象。它使用引用计数来跟踪有多少个shared_ptr共享一个对象,当引用计数为0时,对象被销毁。
#include <memory>

int main() {
    std::shared_ptr<int> ptr1(new int(5));
    std::shared_ptr<int> ptr2 = ptr1;
    std::cout << *ptr1 << " " << *ptr2 << std::endl;
    return 0;
}
  1. std::weak_ptr: std::weak_ptr是一种不持有对象所有权的智能指针,它用于解决shared_ptr的循环引用问题。weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,它不会增加引用计数,只能通过lock方法获取对应的shared_ptr。
#include <memory>

int main() {
    std::shared_ptr<int> ptr(new int(5));
    std::weak_ptr<int> weakPtr = ptr;
    
    if(auto sharedPtr = weakPtr.lock()) {
        std::cout << *sharedPtr << std::endl;
    } else {
        std::cout << "shared_ptr is expired" << std::endl;
    }
    
    return 0;
}

总结: 使用智能指针可以简化内存管理,减少内存泄漏和空悬指针问题。在编写C++代码时,建议尽量使用智能指针来管理动态内存,尤其是在涉及到跨函数调用和多线程的情况下。