1 使用动态内存
1.1 如何描述动态内存
区分好栈上自动分配的变量和自由存储区的变量。
1.2 分配和释放
1.使用new和delete
delete ptr;ptr=nullptr;
2.避免在C++中使用malloc()和free(),他们不会调用构造函数和析构函数
1.3 数组
分配一个二维数组的函数示例:
char** allocateCharacterBoard(size_t xDimension,size_t yDimension)
{
char** myArray{new char*[xDimension]};
for(size_t i{0};i < xDimension;i++){
myArray[i]=new char[yDimension];
}
return myArray;
}
当把数组传递给函数时,编译器将数组视为指针,所以修改数组都是修改原数组的值。
2 底层内存操作
2.1 指针运算
根据声明类型,+一个数表示移动指定个声明的类型的大小。
两个同类型指针相减,得到的是指向的类型的元素个数,而不是两个指针之间字节数的绝对值。
2.2 自定义内存管理
涉及到重载new和delete运算符。
2.3 了解垃圾回收和对象池
进一步了解在后边,C++没有内建垃圾回收,但例如shared_ptr 提供类似垃圾回收的功能,销毁某资源的最后一个shared_ptr实例时,会同时销毁资源。
3 常见的内存陷阱
3.1 缓冲区分配不足以及内存访问越界
3.2 内存泄漏
分配了内存,但没有释放,就会发生内存泄漏。可以通过一些工具追踪内存泄漏。
4 智能指针
当智能指针离开作用域或被重置时,会自动释放所占用的资源。智能指针可用于管理在函数作用域内(或作为类的数据成员)动态分配的资源。也可以通过函数实参来传递动态分配的资源的所有权。
1.可通过模板为任何指针类型编写类型安全的智能指针类
2.可使用运算符重载为智能指针对象提供一个接口,使智能指针对象的使用和普通指针一样