在 Linux 下用 C++ 使用智能指针,本质上是 C++11 及以后标准 提供的内容,和 Linux 本身关系不大,主要是编译器(g++ / clang++)和标准库(libstdc++)支持。
下面按常见用法 + 示例 + 注意事项说明。
在 Linux 编译时要加:
g++ -std=c++11 main.cpp -o main
# 或
g++ -std=c++14 main.cpp -o main
std::unique_ptr(独占所有权,最常用)特点
unique_ptr 拥有对象示例
#include <iostream>
#include <memory>
class Test {
public:
Test() { std::cout << "Test()\n"; }
~Test() { std::cout << "~Test()\n"; }
void say() { std::cout << "hello\n"; }
};
int main() {
std::unique_ptr<Test> p = std::make_unique<Test>();
p->say();
// 转移所有权
std::unique_ptr<Test> p2 = std::move(p);
}
✅ 推荐:优先用 make_unique(C++14)
auto p = std::make_unique<Test>();
std::shared_ptr(共享所有权)特点
shared_ptr 共享同一对象示例
#include <iostream>
#include <memory>
class Test {
public:
~Test() { std::cout << "~Test()\n"; }
};
int main() {
std::shared_ptr<Test> p1 = std::make_shared<Test>();
{
std::shared_ptr<Test> p2 = p1;
std::cout << p1.use_count() << "\n"; // 2
}
std::cout << p1.use_count() << "\n"; // 1
}
✅ 推荐
auto p = std::make_shared<Test>();
std::weak_ptr(解决循环引用)特点
shared_ptrlock() 才能使用示例(防止循环引用)
#include <memory>
struct B;
struct A {
std::shared_ptr<B> b;
};
struct B {
std::weak_ptr<A> a; // 防止循环引用
};
使用:
if (auto sp = b.a.lock()) {
// 安全使用
}
❌ 不要混用裸指针和智能指针
Test* raw = new Test;
std::shared_ptr<Test> p1(raw);
std::shared_ptr<Test> p2(raw); // 双重释放!
❌ 不要用 new 配合智能指针(除非特殊情况)
std::shared_ptr<Test> p(new Test); // 不推荐
✅ 正确方式
auto p = std::make_shared<Test>();
std::unique_ptr<Test> create() {
return std::make_unique<Test>();
}
void func(const std::shared_ptr<Test>& p); // 共享
void func(std::unique_ptr<Test> p); // 转移所有权
| 场景 | 推荐 |
|---|---|
| 独占资源 | unique_ptr |
| 多线程/共享 | shared_ptr |
| 观察者 | weak_ptr |
| 老代码 C++98 | 不能用 |
如果你愿意,我可以:
你现在是用在什么场景?