在 Linux 下使用 C++ 的智能指针,首先需要了解 C++11 标准库中提供的几种智能指针类型。这些智能指针可以自动管理内存资源,帮助避免内存泄漏。以下是 C++11 中最常用的智能指针:
std::unique_ptr
:独占资源所有权的智能指针。它确保同一时间只有一个 unique_ptr
指向给定的对象。当 unique_ptr
被销毁时,它所指向的对象也会被自动删除。#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructor" << std::endl; }
~MyClass() { std::cout << "MyClass destructor" << std::endl; }
};
int main() {
std::unique_ptr<MyClass> ptr(new MyClass());
// 使用 ptr
} // 当 ptr 离开作用域时,MyClass 对象会被自动删除
std::shared_ptr
:共享资源所有权的智能指针。多个 shared_ptr
可以指向同一个对象,通过引用计数来跟踪有多少个 shared_ptr
指向该对象。当最后一个指向对象的 shared_ptr
被销毁时,对象会被自动删除。#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructor" << std::endl; }
~MyClass() { std::cout << "MyClass destructor" << std::endl; }
};
int main() {
std::shared_ptr<MyClass> ptr1(new MyClass());
{
std::shared_ptr<MyClass> ptr2 = ptr1;
// 使用 ptr1 和 ptr2
} // 当 ptr2 离开作用域时,引用计数减一,但 MyClass 对象不会被删除,因为 ptr1 仍然指向它
} // 当 ptr1 离开作用域时,引用计数变为零,MyClass 对象被自动删除
std::weak_ptr
:弱引用智能指针,用于解决 shared_ptr
的循环引用问题。weak_ptr
不会增加引用计数,因此不会影响对象的生命周期。要访问 weak_ptr
指向的对象,需要将其转换为 shared_ptr
。#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructor" << std::endl; }
~MyClass() { std::cout << "MyClass destructor" << std::endl; }
};
int main() {
std::shared_ptr<MyClass> sharedPtr(new MyClass());
std::weak_ptr<MyClass> weakPtr = sharedPtr;
// 使用 sharedPtr
if (auto lockedPtr = weakPtr.lock()) {
// 使用 lockedPtr 访问 MyClass 对象
}
} // 当 sharedPtr 离开作用域时,MyClass 对象被自动删除
在 Linux 下使用这些智能指针时,请确保你的编译器支持 C++11 或更高版本,并在编译时启用相应的选项(例如,使用 -std=c++11
或 -std=c++14
)。