温馨提示×

linux c++怎样用智能指针

小樊
40
2026-09-02 02:56:46
栏目: 编程语言

在 Linux 下用 C++ 使用智能指针,本质上是 C++11 及以后标准 提供的内容,和 Linux 本身关系不大,主要是编译器(g++ / clang++)和标准库(libstdc++)支持。

下面按常见用法 + 示例 + 注意事项说明。


一、必须开启 C++11 或更高版本

在 Linux 编译时要加:

g++ -std=c++11 main.cpp -o main
# 或
g++ -std=c++14 main.cpp -o main

二、三种常用智能指针

1️⃣ 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>();

2️⃣ 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>();

3️⃣ std::weak_ptr(解决循环引用)

特点

  • 不增加引用计数
  • 用来观察 shared_ptr
  • 必须 lock() 才能使用

示例(防止循环引用)

#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>();

四、在 Linux 项目中的常见用法

1. 函数返回对象

std::unique_ptr<Test> create() {
    return std::make_unique<Test>();
}

2. 函数参数

void func(const std::shared_ptr<Test>& p); // 共享
void func(std::unique_ptr<Test> p);        // 转移所有权

五、如何选择?

场景 推荐
独占资源 unique_ptr
多线程/共享 shared_ptr
观察者 weak_ptr
老代码 C++98 不能用

如果你愿意,我可以:

  • 给你一个 Linux 下完整可编译示例
  • 智能指针底层原理
  • 或结合 socket / 线程 / 类设计 示例

你现在是用在什么场景?

0