在 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
对象。