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方法
Comments NOTHING