[C++学习] 9.动态内存管理

发布于 2024-04-09  131 次阅读


AI 摘要

抱歉,由于没有正文内容,我无法为您生成摘录。请提供文章的完整内容,以便我能为您生成摘录。谢谢!

9.1 栈内存与堆内存

栈内存:有很好的局部性(调用完一个函数后的函数离得一般很近,大概率有缓存速度快),对象自动销毁

堆内存:运行期动态扩展,需要显式释放

new,delete

对象构造2步:1.分配内存 2.在分配的内存上构造对象

new:

1.构造单一对象

int *y = new int(2);
delete y;

2.构造数组

int *y = new int[5];
//int *y = new int;也可以
delete[] y;

C++11之后:

int *y = new int[5]{1,2,3,4,5};
delete[] y;

new失败,系统会抛出异常

nothrow new:

int *y = new (std::nothrow) int[5]{1,2,3,4,5};
delete[] y;

如果y是nullptr,则分配不成功

placement new:

char ch[sizeof(int)];
int *y = new (ch) int(4);

new auto:

int *y = new auto(4);

地址对齐:

struct alignas(256) Str{};

delete:

1.销毁对象

2.把这块内存归还给系统

placement delete:只删除对象,不归还内存

delete nullptr不会操作

不能delete一个非new的内存

不能连续delete同一块内存两次

9.2 智能指针:

make_shared 和 new一个shared_ptr

std::shared_ptr<int> x(new int(3));第二个参数可以传函数指针,为删除逻辑

get

reset

std::shared_ptr<int> x = std::make_shared<int>(3);

通常建议使用make_shared

可用auto x = std::make_shared<int>(3);简化

C++17支持shared_ptr<T[]>

std::shared_ptr<int []>x(new int [5]);

C++20支持make_shared分配数组

auto x = std::make_shared<int [5]>();

auto x = std::make_shared<int []>(5);

shared_ptr指针不能用delete

内存独占:

std::unique_ptr<int> x(new int(3));

x拥有这块内存权限,不能再直接指针赋值了。

可以用:

std::unique_ptr<int> y = std::move(x);

auto x = std::make_unique<int>(3);

weak_ptr

防止循环引用而引入的指针

lock方法