智能指针是C++11引入的重要特性,用于自动管理动态分配的内存,防止内存泄漏。在Linux环境下使用智能指针与在其他平台基本相同,但需要注意一些Linux特有的编译和调试事项。
std::unique_ptr
(独占指针)#include <memory>
void example_unique_ptr() {
// 创建unique_ptr
std::unique_ptr<int> ptr(new int(10));
// 使用指针
*ptr = 20;
// 自动释放内存,无需手动delete
}
特点: - 独占所有权,不能复制,只能移动 - 零开销,性能接近裸指针 - 适用于单所有者场景
std::shared_ptr
(共享指针)#include <memory>
void example_shared_ptr() {
// 创建shared_ptr
std::shared_ptr<int> ptr1 = std::make_shared<int>(30);
// 共享所有权
std::shared_ptr<int> ptr2 = ptr1;
// 引用计数为2
// 当最后一个shared_ptr销毁时释放内存
}
特点: - 共享所有权,使用引用计数 - 可以复制 - 适用于多所有者场景 - 比unique_ptr有额外开销
std::weak_ptr
(弱指针)#include <memory>
void example_weak_ptr() {
std::shared_ptr<int> shared = std::make_shared<int>(40);
std::weak_ptr<int> weak = shared;
// 使用时需要先转换为shared_ptr
if (auto temp = weak.lock()) {
// 使用temp
}
}
特点: - 不增加引用计数 - 用于解决shared_ptr的循环引用问题 - 必须从shared_ptr创建
编译选项:
g++ -std=c++11 -o program program.cpp
确保使用C++11或更高标准
调试工具:
bash
valgrind --leak-check=full ./program
与Linux系统API结合:
// 使用智能指针管理文件描述符
struct FileDescriptorDeleter {
void operator()(int* fd) {
if (fd && *fd >= 0) {
close(*fd);
}
delete fd;
}
};
std::unique_ptr<int, FileDescriptorDeleter> fd_ptr(new int(open("file.txt", O_RDONLY)));
优先使用std::make_unique
和std::make_shared
而非直接new:
auto ptr = std::make_unique<MyClass>(args...);
在Linux多线程环境中,shared_ptr的引用计数操作是线程安全的
避免将智能指针与裸指针混用
对于需要自定义删除器的资源(如文件描述符、malloc分配的内存等),使用unique_ptr并指定删除器
在性能敏感代码中优先考虑unique_ptr
编译错误"undefined reference to std::make_unique": 确保使用C++14标准(make_unique是C++14引入的):
g++ -std=c++14 -o program program.cpp
智能指针与第三方C库交互:
void* malloc_data = malloc(100);
std::unique_ptr<void, decltype(&free)> malloc_ptr(malloc_data, &free);
循环引用问题: 使用weak_ptr打破shared_ptr的循环引用
通过合理使用智能指针,可以大大减少Linux C++程序中的内存管理错误,提高代码的安全性和可维护性。