首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

delete数组指针有啥后果?解决方法

2012-10-31 
delete数组指针有啥后果?C/C++ codeclass A{public:~A(){coutaendl}}void main(){A * p new A[1

delete数组指针有啥后果?

C/C++ code
class A{public:    ~A()    {        cout<<"a"<<endl;    }};void main(){    A * p = new A[10];    delete  p;    cout<<"b"<<endl;}


其中 delete p;起了什么作用?
我测试是调了第一个数组元素的析构函数后,程序挂了,为什么?

[解决办法]
delete[]p;
[解决办法]
new p--->delete p
new p[] ---> delete []p
[解决办法]
delete p,只删除了数组的第一个元素
[解决办法]
《effective c++》说的挺详细的!
[解决办法]
new 和 delete
new [] 和 delete []
对称着用,保证木有问题。
[解决办法]
探讨
引用:
delete p,只删除了数组的第一个元素


那程序为啥挂掉啊?

[解决办法]
楼上的都说的很明白了
[解决办法]
我记得我这样做时,编译有警告的...而且还貌似会有内存泄露/.....
[解决办法]
delete []p;就是释放你用new int[]申请的动态内存。如果只用new int[]不用delete[]p,那么申请的内存将无法释放,而这些内存块就不能存其他东西,浪费没用了。我想这就像手机下载软件时在一半的时候不宜在中途按取消键,否则一些内存将无法删除。。。
[解决办法]
首先要明确的一点,系统对于堆区的维护 是基于双链表 的数据结构,当我们NEW 的时候 ,会调用 MALLOC 函数 ,还会继续 调用 一系列函数来 申请内存, 并将 这块内存 区域 的前 32 个字节 做为系统双链表 的新节点 插入到 这个双链表中,当我们申请 资源是 数组 时,在我们申请到的 资源的内存地址 的前面 会存放着我们申请的数组的 元素个数,当释放资源的时候 ,会通过这个元素个数,来实现对资源的 统一 释放,当你只释放那个指针 的时候 ,当然 会出错了。代码如下
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A Constructor is called!"<<endl;
}
~A()
{
cout<<"A Destructor is called!"<<endl;
}
};

void main()
{
A *pvar=new A[16];
cout<<*((int *)pvar-1)<<endl; //这就是访问 数组元素个数
delete []pvar;
pvar=NULL;
}


你申请的是数组,那么 在申请到的资源 的前四个字节 用来 保存 申请的 个数,这个个数 主要用于 对数组资源的释放,你只释放 那个 指针,与操作系统 资源 释放方式 不符,所以会出错。这就像 国家不允许杀人,而你偏要杀,结果只能悲剧了,进监狱了。。。所以说不要与操作系统过不去。- - 按照楼上的 说法 进行资源的释放。。
[解决办法]
delete []p才能正确删除整个动态数组, 如果只delete p的话只删除了数组的第一个对象
[解决办法]
会有内存泄露的
[解决办法]
new->delete
new[]->delete[]

原因是“标准如此,无需深究,浪费时间!”

————————————————
个人愚见,勿喷!
[解决办法]
其中 delete p;起了什么作用?
---------------------------------------------
[]的目的是告诉编译器,检查一下数组的维度,没有[],编译器只析构第一个元素,


我测试是调了第一个数组元素的析构函数后,程序挂了,为什么?
------------------------------------------------------
我想C++标准不会强制规定这种错误编译器要怎么办,

估计编译器行为未必一样

[解决办法]
你可以简单地理解为:

正确的程序才有确定的结果,错误的程序是无法预测结果的.

而你写的属于后者
[解决办法]
关注
一起碰到别人提类似问题,原以为只是析构第一个元素,其他不析构,产生内存泄漏。
没想到居然会导致程序直接挂掉。
------解决方案--------------------


探讨

关注
一起碰到别人提类似问题,原以为只是析构第一个元素,其他不析构,产生内存泄漏。
没想到居然会导致程序直接挂掉。

[解决办法]
内存泄露
[解决办法]
轻漏重挂
[解决办法]
有的编译器会报错。。。。。。。。。。。。。

楼主想对底层实现机制了解,可以《深度探索C++对象模型》

热点排行