c++的delete释放空间的问题

来源:百度知道 编辑:UC知道 时间:2024/05/28 15:55:24
int (*p)[100];

p=new int[30][100];

书上说delete [30]p,释放二维数组空间,而delete p;是释放第0行空间,请问为什么delete p是释放第0行的地址,p是一个占4个字节的指针,*p是指向第0行的,应该delete *p是释放第0行的地址????请大家解释下

没见过delete [30]p这种语法,应该是delete []p;
这个是释放二维数组,这是固定的语法,用来释放数组空间
delete []p,编译器会将p指向的空间作为连续数组空间释放
而delete p,则告诉编译器p指向的是一个变量,在这里所谓的变量相当于是“int[100]”,这一一维数组,所以只会释放p指向的的这一“变量”

delete没有[]时,是将p所指的变量空间释放,而不是p本身,如果加上[],那么编译器会将p所指向的内存区域作为数组删除,前提是这一区域已经作为数组分配,否则程序就自爆了

你有些混淆了数据和指针的,因为他们之间的界限确实不是很明显,简单说指针就是起指向作用的变量

在这里delete *p是不对的,因为p是指针,经过*作用后就是p所指向的变量,是数据,你相当于是强制编译器认为*p是指针,这样它就将*p这一变量存储的数字所指向内存进行释放,这是很明显的一个错误,除非你想程序自爆!!!

呵呵,可能有些绕,正常,C的难点就在指针,慢慢啃就会明白了,欢迎继续交流

指针在C++ primer plus 书里又叫地址操作符 也就是说 声明一个指针 实际上是声明了一个内存地址 而*号和指针连用的时候又叫地址解析符 也就是把指针指向的地址的内存解析读出数据

这就是为什么无论你声明了指针指向的是整形 浮点 他都是只占用4字节 因为他是指针 是表示一个地址 地址位数当然是恒定的

联系你说的 我觉得有地方是不对的 delete应该是和new操作符联合使用 而不应该是单独使用delete 也就是在代码前面应该用new声明了一个用指针表示的数组 那么数组使用完以后就需要用delete来释放掉使用的内存空间 因为new声明的地址空间 系统不会自动删除 需要程序员用delete来释放 另外 在c/c++语言里数组的大小必须声明时候确定,也就是说这样的声明数组是不对的:
int i=5;
int arr[i];//错误 ,i是一个变量 不可以用变量来对数组命名,如果把i声明成静态变量 ,就又可以用了
static int i=5;
int arr