简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:C++之shared_ptr、unique_ptr、make_shared、make_unique的用法区别
1.shared_ptr、unique_ptr、make_shared、make_unique用法
-
shared_ptr
是共享所有权的智能指针,可以多个shared_ptr
指向同一个对象。对象会在所有shared_ptr
都被销毁后自动释放。
-
unique_ptr
是独占所有权的智能指针,一个对象只能由一个unique_ptr
指向。当unique_ptr
被销毁或者重置时,对象会被自动释放。
-
make_shared
是用于创建shared_ptr
的工厂函数,可以一次性分配内存并创建对象。相比直接使用shared_ptr
构造函数,make_shared
能够更高效地分配内存并消除额外的内存分配开销。
-
make_unique
是用于创建unique_ptr
的工厂函数,可以一次性分配内存并创建对象。
2.shared_ptr、unique_ptr、make_shared、make_unique之间的区别
-
- 所有权:
shared_ptr
允许多个指针共享对同一对象的所有权,而unique_ptr
则是独占所有权,一个对象只能由一个unique_ptr
指向。
- 所有权:
-
- 内存管理:
shared_ptr
使用引用计数来管理内存,而unique_ptr
则使用独占式拥有方式来管理内存。
- 内存管理:
-
- 创建方式:
shared_ptr
和unique_ptr
都可以直接使用构造函数来创建对象,而make_shared
和make_unique
是工厂函数,用于一次性分配内存和创建对象。
- 创建方式:
-
- 平台兼容性:
make_shared
在 C++11 中引入,而make_unique
在 C++14 中引入。所以在使用旧版本的编译器时,可能无法使用这两个工厂函数。
- 平台兼容性:
2.实例
<1>.shared_ptr实例
#include <memory>
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass object created!" << std::endl;
}
~MyClass() {
std::cout << "MyClass object destroyed!" << std::endl;
}
};
int main() {
std::shared_ptr<MyClass> sharedPtr1 = std::make_shared<MyClass>();
std::shared_ptr<MyClass> sharedPtr2 = sharedPtr1;
return 0;
}
<2>.unique_ptr实例
#include <memory>
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass object created!" << std::endl;
}
~MyClass() {
std::cout << "MyClass object destroyed!" << std::endl;
}
};
int main() {
std::unique_ptr<MyClass> uniquePtr = std::make_unique<MyClass>();
return 0;
}
<3>.make_shared实例
#include <memory>
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass object created!" << std::endl;
}
~MyClass() {
std::cout << "MyClass object destroyed!" << std::endl;
}
};
int main() {
std::shared_ptr<MyClass> sharedPtr = std::make_shared<MyClass>();
return 0;
}
<4>.make_unique实例
#include <memory>
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass object created!" << std::endl;
}
~MyClass() {
std::cout << "MyClass object destroyed!" << std::endl;
}
};
int main() {
std::unique_ptr<MyClass> uniquePtr = std::make_unique<MyClass>();
return 0;
}