1. C++ 动态内存分配简介
C++ 动态内存分配 使用new运算符函数实现, 其动态内存释放使用delete运算符函数实现
new:
早期C++编译器:
new运算符成功分配内存返回非空指针,失败返回空指针
现代C++编译器:
new运算符成功分配成功返回非空指针,失败抛出异常(异常后续说明)
为了避免兼容性问题,现代C++编译器支持new运算不抛出异常,如下
#include <iostream>
using namespace std;
int main(void)
{
int* p = new(std::nothrow) int;
cout << "p = " << p << endl;
return 0;
}
2. 程序举例
delete:
传给一个空指针给delete是不会出错的,同C语言中的free类似
2.1 基本数据类型的动态分配释放
#include <iostream>
using namespace std;
#include <iostream>
using namespace std;
int main(void)
{
//使用new ,同时初始化
int *pa = new int(99);
double *pd = new double(99.9);
//使用new,但是不给初始值
int *pb = new int;
char *pc = new char;
*pb = 99;
*pc = 'c';
cout << *pa << " "<<*pb << " " << *pc << " "<< *pd << endl;
delete pa;
delete pb;
delete pc;
delete pd;
return 0;
}
输出
99 99 c 99.9
2.2 使用基本类型与数组
#include <iostream>
int main()
{
int *pa = new int[3] {66,88,99};
char *pc = new char[3] {'a','b','c',};
double *pd = new double[3];
using namespace std;
cout << pa[0] << ' ' << pa[1] << ' ' << pa[2] << endl;
cout << pc[0] << ' ' << pc[1] << ' ' << pc[2] << endl;
delete [] pa;
delete [] pc;
delete [] pd;
return 0;
}
输出:
66 88 99
a b c
2.3 通常把指针设置为NULL,因为不会有什么风险
#include <iostream>
int main()
{
int *pa = NULL;
delete pa;
return 0;
}
2.4 多次释放同一块内存
//doublefree.cpp
#include <iostream>
int main(void)
{
int *pa = new int;
delete pa;
//再delete一次
delete pa;
return 0;
}
//doublefree.c
#include <cstdlib>
int main(void)
{
int *pa = (int*) malloc(sizeof(int) * 10);
free(pa);
free(pa);
return 0;
}