C++有关delete p与delete []p的问题
请问大家一个问题:在C++中,删除一个用new分配的数组用以下格式:inta[]=newint[8];delete[]a;请问编译器是怎么知道数组a的大小的?另外,如下的...
请问大家一个问题:在C++中,删除一个用new分配的数组用以下格式:
int a[]=new int [8];
delete []a;
请问编译器是怎么知道数组a的大小的?
另外,如下的用法可以不,
int a[8];
int *p=a;
delete p;
这里"delete p"的用法有没有问题?改成"delete []p"呢? 展开
int a[]=new int [8];
delete []a;
请问编译器是怎么知道数组a的大小的?
另外,如下的用法可以不,
int a[8];
int *p=a;
delete p;
这里"delete p"的用法有没有问题?改成"delete []p"呢? 展开
展开全部
对于楼主定义的int[] 来说,
delete和delete[] 效果完全一样。
就释放内存来说,编译器是根据你这个指针的地址来知道这块内存的大小的,因为你申请的时候,内存管理器记录了这个地址开始的申请的内存的大小。
delete和delete[]的差别,在数组元素是一个对象的时候,就可以体现出来。
delete一般情况下,只会永远开始地址那个对象的析构函数,而delete[]可以调用数组中所有对象的析构函数。
对于简单的数据类型而言,delete和delete[]都只是释放内存,没有什么区别。
delete和delete[] 效果完全一样。
就释放内存来说,编译器是根据你这个指针的地址来知道这块内存的大小的,因为你申请的时候,内存管理器记录了这个地址开始的申请的内存的大小。
delete和delete[]的差别,在数组元素是一个对象的时候,就可以体现出来。
delete一般情况下,只会永远开始地址那个对象的析构函数,而delete[]可以调用数组中所有对象的析构函数。
对于简单的数据类型而言,delete和delete[]都只是释放内存,没有什么区别。
展开全部
编译器通过单个int类型数据占用的内存空间,自然可以算出8个int数据需要的空间,从而分配一块连续的内存空间使用,至于更加详细具体的内容,楼主其实不需要关心,如果要学得很深入,可以看看编译原理
至于后面的用法,int *p=a;是可以的,定义一个指针指向一个数组,由数组和指针的关系,相当于给数组a取了一个名子为p的别名
但是delete p;就有问题了,delete作用是将开辟的内存空间释放,而指针本身没有开辟内存空间,所以是不合法的,而且编译器在编译时不会检查,只有运行才会报错
delete p[] 有同样问题,不能通过别名来释放内存,因为编译器不知道本名的内存是否还要使用
但是楼主最开始的:
int a[]=new int [8];
delete []a;
这些定义删除没有问题,那个不存在别名问题,就是释放数组a的占有的内存空间
至于后面的用法,int *p=a;是可以的,定义一个指针指向一个数组,由数组和指针的关系,相当于给数组a取了一个名子为p的别名
但是delete p;就有问题了,delete作用是将开辟的内存空间释放,而指针本身没有开辟内存空间,所以是不合法的,而且编译器在编译时不会检查,只有运行才会报错
delete p[] 有同样问题,不能通过别名来释放内存,因为编译器不知道本名的内存是否还要使用
但是楼主最开始的:
int a[]=new int [8];
delete []a;
这些定义删除没有问题,那个不存在别名问题,就是释放数组a的占有的内存空间
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
delete p与delete []p:
delete p释放p所指的内存,如果p是类对象,还会调用p的析构函数;
delete []p释放p所指数组的内存,如果p是类对象,分别调用每个数组元素p[i]的析构函数;编译器通过“遍历”数组每个元素而进行删除,它并不是事先知道了大小,而是进行遍历搜索。
delete p释放p所指的内存,如果p是类对象,还会调用p的析构函数;
delete []p释放p所指数组的内存,如果p是类对象,分别调用每个数组元素p[i]的析构函数;编译器通过“遍历”数组每个元素而进行删除,它并不是事先知道了大小,而是进行遍历搜索。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int a[8];
int *p=a; //这个是可以的。把a的首地址赋给指针p;
delete p 不可以。一般delete和new 配套。p=a只是让p的首地址指向a,并没有开辟空间,所以不能delete。
至于编译器是怎么知道a数据大小,可以看看effective c++。
int *p=a; //这个是可以的。把a的首地址赋给指针p;
delete p 不可以。一般delete和new 配套。p=a只是让p的首地址指向a,并没有开辟空间,所以不能delete。
至于编译器是怎么知道a数据大小,可以看看effective c++。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在C++中,删除一个用new分配的数组用以下格 在数组元素是一个对象的时候,就可以体现出来
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询