NEW
new对象一般用法
int *pi = new int;
int *pi=new int(1024);
string *ps=new string(10,'9');
vector<int> *pv=new vector<int>{0,1,2,3,4,5,6,7,8,9}; // 列表初始化
区别:
(1)string *ps1=new string; // 默认初始化
(2)string *ps=new string(); // 值初始化为空
对于内置类型或组合类型的对象,默认初始化对象的值时未定义;而对于类类型的对象,均调用默认构造函数来初始化;
一般:指针与动态分配内存与释放
明确地分配内存,就可以在堆上放置任何内容;
任何情况下,都不应该使用未初始化的指针;应声明指针的同时初始化指针;;如果不想立即分配内存,可以把他们初始化为空指针nullptr;
int * myIntegerPointer;
int* myIntegerPointer =nullptr
myIntegerPointer=new int;
在解除引用之前,指针必须有效;对null或未初始化的指针解除引用,会引起程崩溃;
*myIntegerPointer=8;
在使用完动态分配的内存后,需要用delete释放内存;
为防止在释放指针指向的内存后再使用指针,可以将指针指向nullptr;
delete myIntegerPointer;
myIntegerPointer=nullptr;
delete const对象
const 对象的值虽然不能被改变,但是本身是可以被销毁的;
const int *pci=new const int(1024);
delete pci;
动态分配的数组
int arraySize=8;
int* myVariablesizedArray= new int[arraySize];
myVariablesizeArray[3]=2;
delete[] myvariablesizedArray;
智能指针:unique_ptr、shared_ptr、weak_ptr
unique_ptr:
智能指针在对象超出作用域会被删除时,会自动释放内存或资源;例如函数执行完毕后,会自动释放内存;
unique_ptr是一个通用的智能指针,他可以指向任意类型的内存。
它是一个模板;
模板需要用尖括号指定模板参数,指定unique_ptr要指向的内存类型;
Employee* anEmployee= new Employee;
auto anEmployee= std::make_unique<Employee>();
c++14以前:std::make_unique<Employee> anEmployee(new Employee);
可以像普通指针那样使用anEmployee指针;
shared_ptr:允许数据的分布式“所有权”;
有一个引用计数,指定“拥有者”个数,没超出作用域一次,就递减引用计数;计数为0时,释放指针引用的对象;
不能存储数组;
std::make_shared<>()创建shared_ptr;
weak_ptr:可以观察shared_ptr,而不会递减或递增所链接shared_ptr的引用计数;
类中动态分配的指针与释放:
1、构造函数中,动态分配二维数组
SpreadsheetCell** mCells;
Spreadsheet::Spreadsheet(int inWidth, int inHeight): mWidth(inWidth), mHeight(inHeight)
{
mCells =new SpreadsheetCell* [mWidth];
for (int i=0; i<mWidth; i++){
mCells[i] =new SpreadsheetCell[mHeight];
}
}
2、在析构函数中释放在构造函数中分配的内存
Spreadsheet::~Spreadsheet()
{
for(int i=0; i<mWidth;i++){
delete [] mCells[i];
}
delete [] mCells;
mCells=nullptr;
}