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;

}

原文地址:https://www.cnblogs.com/wllwqdeai/p/10069716.html