c++ std::make_unique 是什么意思怎么使用

C++ 的 std::makeunique 是啥,怎么用。std::makeunique 是 C++14 引入的一个工具,用来创建 std::unique_ptr(独占智能指针),简单、安全又省心。咱们一步步讲清楚。

啥是 std::make_unique?

想象你买了个独一无二的玩具(比如限量版手办),这个玩具只能你自己玩,不能给别人。std::uniqueptr 就是这种“独占所有权”的指针,管着内存,死了自动回收。std::makeunique 是帮你“制造”这个玩具的工厂,直接给你个成品,不用自己拼装,还能避免出错。

简单说:std::makeunique 是一个便捷函数,创建并返回一个 std::uniqueptr,自动管理动态内存。

为啥用它?

安全:比自己手动 new 再塞进 unique_ptr 更安全,避免内存泄漏。

简单:一行搞定,不用写繁琐代码。

性能:直接分配内存并构造对象,效率高。

怎么用?

1. 基本用法:创建简单对象

#include <memory>
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass 构造\n"; }
    ~MyClass() { std::cout << "MyClass 析构\n"; }
    void say() { std::cout << "Hello!\n"; }
};

int main() {
    // 用 make_unique 创建 unique_ptr
    auto ptr = std::make_unique<MyClass>();
    ptr->say(); // 调用对象方法
    return 0;   // ptr 离开作用域,自动删除
}

输出:

MyClass 构造
Hello!
MyClass 析构

std::makeunique():创建 MyClass 对象,返回 uniqueptr。 auto:自动推导类型,省得写 std::unique_ptr。 离开 main,ptr 自动销毁,内存释放

2. 带参数构造

如果类有构造函数带参数:

#include <memory>
#include <string>
#include <iostream>

class MyClass {
    std::string name;
public:
    MyClass(std::string n) : name(n) { std::cout << "构造: " << name << "\n"; }
    void say() { std::cout << "我是 " << name << "\n"; }
};

int main() {
    auto ptr = std::make_unique<MyClass>("小明");
    ptr->say();
    return 0;
}

输出:

构造: 小明
我是 小明

std::make_unique("小明"):传参数给构造函数,跟普通构造一样。

3. 和裸指针对比

不用 make_unique 的老办法:

auto ptr = std::unique_ptr<MyClass>(new MyClass("小明"));

得手动 new,然后塞进 unique_ptr,麻烦点。

如果中间抛异常(比如 new 后没到 unique_ptr 构造),可能漏内存。

make_unique 好处:

一气呵成,构造和绑定一起完成,不会漏。

4. 用在容器里

想存一堆智能指针:

#include <memory>
#include <vector>
#include <iostream>

class MyClass {
public:
    int id;
    MyClass(int i) : id(i) {}
    void print() { std::cout << "ID: " << id << "\n"; }
};

int main() {
    std::vector<std::unique_ptr<MyClass>> vec;
    vec.push_back(std::make_unique<MyClass>(1));
    vec.push_back(std::make_unique<MyClass>(2));

    for (auto& p : vec) {
        p->print();
    }
    return 0;
}

输出:

ID: 1
ID: 2

pushback 直接接 makeunique,干净利落。

注意点

不能复制: unique_ptr 是独占的,不能直接赋值:

auto ptr1 = std::make_unique<MyClass>();
// auto ptr2 = ptr1; // 错!不能复制
auto ptr2 = std::move(ptr1); // 对!转移所有权

返回类型: std::makeunique() 返回 std::uniqueptr,别忘了用 auto 或明确类型。

数组用法: 创建数组用特殊版本

auto arr = std::make_unique<int[]>(5); // 5个int的数组
arr[0] = 42;
std::cout << arr[0] << "\n"; // 42

和 std::makeshared 比比 std::makeshared 是给 std::sharedptr(共享指针)用的,多个指针共享内存。 std::makeunique 是给 std::uniqueptr 的,只有一个主人。 用哪个看需求:独占用 makeunique,共享用 make_shared。

需要掌握啥?

基本用法:std::make_unique(参数) 创建对象。

所有权转移:用 std::move 移交 unique_ptr。

场景:

代替 new,管理动态内存。

在容器里存指针,避免手动删除。

优点:安全、简洁,现代 C++ 标配。

总结

std::makeunique 是创建 uniqueptr 的快捷方式,省心又防漏。

用法简单:auto ptr = std::make_unique<类>(参数),然后随便玩。

记住它是独占的,死了自动清理。

文档信息

版权声明:可自由转载(请注明转载出处)-非商用-非衍生

发表时间:2025年7月1日 11:33