C++学习之-std::make_unique 与std::unique_ptr
std::make_unique 是 C++14 中引入的一个函数模板,用于创建一个指向动态分配对象的 std::unique_ptr。它的语法如下:
template< class T, class... Args >
std::unique_ptr<T> make_unique( Args&&... args );
std::make_unique 比直接使用 new 更安全,因为它可以避免发生内存泄漏,即使在构造函数抛出异常的情况下。
下面是一个使用 std::make_unique 的示例:
auto ptr = std::make_unique<int>(42);
这将创建一个指向 int 类型的 std::unique_ptr,并将其初始化为值 42。
在回答你其他的问题之前,请告诉我你想了解的具体内容,以便我能够更好地回答你。谢谢!
std::unique_ptr和std::make_unique的用法
std::unique_ptr
和 std::make_unique
是 C++11 引入的智能指针和辅助函数,用于管理动态分配的内存,避免内存泄漏。以下是它们的用法介绍:
std::unique_ptr
std::unique_ptr
是一个独占所有权的智能指针,它负责管理动态分配的对象,并在其生命周期结束时自动释放内存。std::unique_ptr
不能被复制,但可以被移动。
基本用法
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructor\n"; }
~MyClass() { std::cout << "MyClass destructor\n"; }
void doSomething() { std::cout << "Doing something\n"; }
};
int main() {
// 创建一个 std::unique_ptr 对象
std::unique_ptr<MyClass> ptr(new MyClass());
// 使用智能指针
ptr->doSomething();
// 无需手动释放内存
return 0;
}
移动语义
#include <iostream>
#include <memory>
int main() {
std::unique_ptr<int> ptr1(new int(10));
std::unique_ptr<int> ptr2 = std::move(ptr1); // 移动所有权
if (!ptr1) {
std::cout << "ptr1 is empty\n";
}
if (ptr2) {
std::cout << "ptr2 has value: " << *ptr2 << "\n";
}
return 0;
}
std::make_unique
std::make_unique
是一个辅助函数,用于简化 std::unique_ptr
的创建过程。它返回一个 std::unique_ptr
对象,并确保异常安全。
基本用法
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructor\n"; }
~MyClass() { std::cout << "MyClass destructor\n"; }
void doSomething() { std::cout << "Doing something\n"; }
};
int main() {
// 使用 std::make_unique 创建一个 std::unique_ptr 对象
auto ptr = std::make_unique<MyClass>();
// 使用智能指针
ptr->doSomething();
// 无需手动释放内存
return 0;
}
优点
- 异常安全:使用
std::make_unique
可以确保在对象构造过程中如果抛出异常,不会导致内存泄漏。 - 简洁:代码更简洁,更易读。
总结
std::unique_ptr
和 std::make_unique
提供了便捷且安全的方式来管理动态分配的内存,避免了手动管理内存的繁琐和潜在的内存泄漏问题。
std::shared_ptr 和 std::make_unique 的区别
std::shared_ptr
和 std::make_unique
都是 C++11 标准引入的智能指针和内存管理工具。
std::shared_ptr
是一种智能指针,用于共享资源的所有权。它允许多个指针共享同一个对象,直到最后一个引用计数为 0 时,对象才会被销毁。使用 std::shared_ptr
时,需要注意循环引用的问题,因为这可能会导致资源无法及时释放。
std::make_unique
是 C++14 标准引入的一个函数模板,用于创建动态分配的对象,返回一个独占的智能指针。它的优点是可以避免内存泄漏和异常安全问题,因为它会在构造函数抛出异常时自动销毁对象。同时,由于使用了 std::unique_ptr
,也避免了循环引用的问题。
主要的区别在于,std::shared_ptr
可以被多个指针共享,而 std::make_unique
返回的是一个独占的指针。此外,std::make_unique
更加安全,因为它避免了内存泄漏和异常安全问题。
相关推荐
















