new关键字和delete关键字
C语言中使用malloc()函数和free()函数来分配内存和释放内存,在C++中有更好的办法就是使用new和delete关键字,通用的格式为:
typeName *pointer_name = new typeName;
// …
delete pointer_name;
在使用完内存后,用delete关键字可以将其归还给内存池。注意delete只是释放指针指向的内存,但不会删除指针本身,可以将指针重新指向另一个新分配的内存块,但是一定要切记配对地使用new和delete,否则将发生内存泄露(memory leak),也就是说,被分配的内存再也无法使用了。如果内存泄露严重,则程序将由于不断寻找更多内存而终止。另外不要释放已经释放的内存块,这样做的结果将是不确定的,切勿玩火。另外:
int value = 1;
int *p_value = &value;
delete p_value;
释放声明变量所获得的内存是不可以的,只能用delete来释放使用new分配的内存,然而对空指针使用delete是安全的。
int *p1 = new int;
int *p2 = p1;
delete p2;
对于一个内存块可以有多个指针指向它,释放时只需要delete任何一个指针即可,但是尽量不要创建多个指向同一内存的指针。
创建动态数组
编译时给数组分配内存被称为静态联编(static binding),运行时创建数组并分配内存称为动态联编(dynamic binding)。格式为:
typeName *pointer_name = new typeName[num_elements];
// …
delete [] pointer_name;
通过指针访问数据:
int *array1 = new int[3];
array1[0] = 0;
array1[1] = 1;
array1[2] = 2;
cout << "Method 1 :" << endl;
cout << array1[0] << " " << array1[1] << " " << array1[2] << endl;
cout << endl;
delete[] array1;
note: new 来分配内存 容易产生越界问题,而vector知道自己的大小,则不用担心。
空指针: c++11中专门设定nullptr作为空指针
delete 释放内存两种方式:
1.delete p 释放单个new分配的对象
2. delete [] p 释放new分配的对象数组
小知识:
static_cast 可以用于在两种相关指针类型之间进行转换
viod *p;
int*q = static_cast<int*>(p)
reinterpret_cast 可以用于在两个不相关的类型之间转换,例如:int和double
const_cast 可以“去掉const”