C++:智能指针了解
介绍
C++ 中的智能指针是一种用于自动管理动态分配的内存的类模板。它们可以帮助程序员避免内存泄漏和悬挂指针等问题。C++11 引入了三种主要的智能指针:
std::unique_ptr、
std::shared_ptr 和
std::weak_ptr。每种智能指针都有其特定的用途和优势。
std::unique_ptr
std::unique_ptr 表示对对象的独占所有权。在同一时间内,只能有一个 std::unique_ptr 指向一个给定的对象。当 std::unique_ptr 被销毁时(例如,离开作用域时),它所指向的对象也会被自动删除。
#include <memory>
#include <iostream> class MyClass {
public: MyClass() { std::cout << "MyClass created\n"; } ~MyClass() { std::cout << "MyClass destroyed\n"; } void sayHello() { std::cout << "Hello, World!\n"; }
}; int main() { std::unique_ptr<MyClass> ptr(new MyClass()); ptr->sayHello(); // 使用智能指针调用成员函数 // ptr 被销毁时,MyClass 对象也会被自动删除 // 无需手动调用 delete return 0;
}
std::shared_ptr
std::shared_ptr 表示对对象的共享所有权。多个 std::shared_ptr 实例可以指向同一个对象,且只有当最后一个指向该对象的 std::shared_ptr 被销毁时,对象才会被删除。这通过内部使用引用计数实现。
#include <memory>
#include <iostream> class MyClass {
public: MyClass() { std::cout << "MyClass created\n"; } ~MyClass() { std::cout << "MyClass destroyed\n"; } void sayHello() { std::cout << "Hello, World!\n"; }
}; int main() { std::shared_ptr<MyClass> ptr1(new MyClass()); std::shared_ptr<MyClass> ptr2 = ptr1; // ptr1 和 ptr2 共享所有权 ptr1->sayHello(); // 当 ptr1 和 ptr2 都被销毁时,MyClass 对象才会被删除 return 0;
}
std::weak_ptr
std::weak_ptr 是一种不拥有其所管理对象的智能指针。它主要用于解决 std::shared_ptr 之间的循环引用问题。std::weak_ptr 可以被转换为std::shared_ptr,但这会临时增加对象的引用计数,如果引用计数为 0,则对象会被删除,返回的 std::shared_ptr 将为空。通常与 std::shared_ptr 一起使用)
#include <memory>
#include <iostream> class MyClass {
public: MyClass() { std::cout << "MyClass created\n"; } ~MyClass() { std::cout << "MyClass destroyed\n"; }
}; int main() { std::shared_ptr<MyClass> ptr1(new MyClass()); std::weak_ptr<MyClass> ptr2 = ptr1; // 使用 ptr2 时,需要将其转换为 shared_ptr if (std::shared_ptr<MyClass> ptr3 = ptr2.lock()) { // 如果 ptr2 指向的对象存在,则 ptr3 非空 // ... } // 当 ptr1 被销毁时,MyClass 对象也会被删除 // ptr2 不阻止对象的删除 return 0;
}