智能指针是C++中的一个对象,它的行为类似于指针,但它提供了自动的内存管理功能。当智能指针超出作用域时(比如说在函数中使用智能指针指向了一个对象,当该函数结束时会自动销毁该对象),它会自动删除其所指向的对象,这样可以避免内存泄露。C++11及之后的标准库中提供了几种不同类型的智能指针,包括:
**在局部函数中创建了一个局部对象的话,在函数结束后局部对象会被自动释放,但是若创建的是一个new对象在不使用智能指针的情况下若在函数结束运行时没销毁就会造成内存泄漏。
**
std::unique_ptr:
unique_ptr指向一个给定的对象)。unique_ptr超出作用域或被删除时,它所指向的对象也会被删除。std::unique_ptr<int> p1(new int(5));
std::unique_ptr<int> p2 = std::move(p1); // p1现在为空,p2指向之前的对象
std::shared_ptr:
shared_ptr指向同一个对象。shared_ptr指向同一个对象。shared_ptr被销毁时,对象会被删除。std::shared_ptr<int> p1 = std::make_shared<int>(5);
std::shared_ptr<int> p2 = p1; // 两者指向同一个对象,引用计数增加
std::weak_ptr:
shared_ptr的伴侣,不会增加引用计数。shared_ptr可能引起的循环引用问题。weak_ptr转换为shared_ptr才能访问其所指向的对象。std::shared_ptr<int> p1 = std::make_shared<int>(5);
std::weak_ptr<int> wp = p1; // wp指向p1所指的对象,但不增加引用计数
使用建议:
unique_ptr。shared_ptr。shared_ptr的循环引用时,使用weak_ptr。注意:虽然智能指针提供了自动的内存管理功能,但仍然需要注意不要在非智能指针和智能指针之间产生混淆,这可能导致未定义的行为或其他问题。
下面是每种智能指针的使用场景及其价值:
std::unique_ptr
unique_ptr,该指针在这段时间内唯一地拥有这个连接。当线程完成工作并释放unique_ptr时,连接返回到连接池。unique_ptr离开作用域时,对象被自动删除,避免内存泄漏。std::shared_ptr
shared_ptr实例共享其管理的对象,并且当最后一个shared_ptr被销毁时,它们所管理的对象也会被自动删除。std::weak_ptr
shared_ptr的循环引用问题。shared_ptr指向子对象,而子对象有一个weak_ptr指向父对象。这样,即使父对象被删除,子对象不会因为循环引用而无法被正确地删除。通过使用这些智能指针,C++开发者可以更加容易地管理内存,减少内存泄漏和其他内存管理错误。