在 Linux 下使用 C++ 智能指针,首先需要了解 C++11 标准库中提供的几种智能指针类型。智能指针是一种对象,它可以存储指向动态分配内存的指针,并在其生命周期结束时自动释放内存。这有助于避免内存泄漏和其他与手动内存管理相关的问题。
C++11 标准库提供了以下几种智能指针:
std::unique_ptr
:独占资源所有权的智能指针。当 unique_ptr
被销毁时,它所指向的对象也会被自动删除。不能复制 unique_ptr
,但可以移动它。std::shared_ptr
:共享资源所有权的智能指针。多个 shared_ptr
可以指向同一个对象,当最后一个指向对象的 shared_ptr
被销毁时,对象会被自动删除。std::weak_ptr
:配合 shared_ptr
使用,用于解决循环引用问题。weak_ptr
不会增加引用计数,因此不会阻止对象被删除。下面是在 Linux 下使用这些智能指针的示例:
#include <iostream> #include <memory> class MyClass { public: MyClass() { std::cout << "MyClass constructor" << std::endl; } ~MyClass() { std::cout << "MyClass destructor" << std::endl; } }; int main() { // 使用 unique_ptr std::unique_ptr<MyClass> uniquePtr(new MyClass()); // uniquePtr 对象在离开作用域时会自动删除 MyClass 对象 // 使用 shared_ptr std::shared_ptr<MyClass> sharedPtr1(new MyClass()); { std::shared_ptr<MyClass> sharedPtr2 = sharedPtr1; // sharedPtr1 和 sharedPtr2 共享同一个 MyClass 对象的所有权 } // sharedPtr2 离开作用域,但 MyClass 对象不会被删除,因为 sharedPtr1 仍然指向它 // sharedPtr1 离开作用域时,MyClass 对象会被自动删除 // 使用 weak_ptr 避免循环引用 std::shared_ptr<MyClass> sharedPtr3(new MyClass()); std::weak_ptr<MyClass> weakPtr = sharedPtr3; // weakPtr 不会增加引用计数,因此不会阻止 MyClass 对象被删除 // 当 sharedPtr3 离开作用域并被删除时,weakPtr 仍然可以用来检查对象是否已被删除 if (auto lockedPtr = weakPtr.lock()) { // 对象仍然存在,可以使用 lockedPtr 访问它 } else { // 对象已被删除 } return 0; }
要编译此代码,请确保使用支持 C++11 的编译器(如 g++ 或 clang++),并添加 -std=c++11
标志:
g++ -std=c++11 main.cpp -o main ./main
这将输出以下内容:
MyClass constructor MyClass destructor MyClass constructor MyClass destructor MyClass constructor MyClass destructor MyClass destructor
这表明智能指针在适当的时候正确地创建和删除了 MyClass
对象。