牛哥帮忙!内存泄露,delete出错!

hotchen001 2009-08-10 01:23:20
代码如下:
#include <iostream.h>
main()
{
int *pArray;
pArray=new int;
int a[]={1,2,3,4,5,6};
pArray=a;
for(int i=0;i<=5;i++)
cout<<*pArray+i;
delete [] pArray;
return 0;
}
编译结果正确为123456,但是有个Debug Assertion Failed窗口弹出来!提示_block_type_is_valid(pHead->nBlockUse)
代码改为:
#include <iostream.h>
main()
{
int *pArray;
pArray=new int;
int a[]={1,2,3,4,5,6};
pArray=a;
for(int i=0;i<=5;i++)
cout<<*pArray+i<<endl;
// delete [] pArray;
return 0;
}
运行结果正确,没有任何错误提示,再次运行此代码依然没出错提示,说明内存没有泄露,但是有了pArray=new int;
这句却没delete释放内存居然不出错,加上delete [] pArray;这句居然会出错,我要崩溃了!
麻烦各位牛哥帮小弟个忙解答解答,感激不尽!
...全文
232 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
hotchen001 2009-08-13
  • 打赏
  • 举报
回复
谢谢zyq5945、codewarrior的精彩讲解,通过这篇帖子我学到好多!真的太谢谢大家了,正是有了你们的无私帮助,我们这些菜鸟才能慢慢成长!
这篇帖子就到这里吧!
会思考的草 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hotchen001 的回复:]
引用 13 楼 zyq5945 的回复:
sizeof(p1)等于4;sizeof(p2)等于40。


这位大哥,小弟不知道到底错在哪啊!你给个答案给我,我还是云里雾里啊!麻烦详细点啊!
[/Quote]
嗯,首先你先考虑一下,sizeof的值是啥时候算出来的?
然后你就可以进一步思考,为什么sizeof的值不一样?这说明编译器内部对于数组和指针,完全是当作不同的两种东西来处理的,它们其实是两种东西。
dronly 2009-08-10
  • 打赏
  • 举报
回复
楼主的问题主要在这里吧?

int *pArray;
pArray=new int;
int a[]={1,2,3,4,5,6};
pArray=a;
for(int i=0;i <=5;i++)
cout < <*pArray+i;
delete [] pArray;

这个里面很明显的有一个地方没考虑,就是变量的生存期,这个对于程序特别是C++程序来说是致命的。

pArray=a;这个是可以把地址当变量传送过去,但实际上a系统是会自动收回的;

反而pArray=new int;系统不自动删除的你没手动删除。

就算int a[]={1,2,3,4,5,6}; 写成int *a=new int[6];进行下面的程序也是错误的,因为最终

delete [] pArray; 会根据pArray记录的内存来释放int类型的空间。

个人愚见,欢迎拍砖。
zyq5945 2009-08-10
  • 打赏
  • 举报
回复
int* p1 = new int[10]
可以分解为下面两个语句
int* p1 ;//这里仅仅是定义一个指针,表明它指向的是一个int类型的变量
p1 = new int[10];
你用*p1[n]或者*(p1+n)访问的也仅仅是这个int类型的指针指向的变量,即使你用*p1[10]访问也是一个越界的int类型的变量。
zyq5945 2009-08-10
  • 打赏
  • 举报
回复
指针,数组指针和指针数组的概念。
p1就是一个指针,简简单单的指针,不是数组指针。
http://www.cppblog.com/cooleaf/archive/2006/05/19/7418.html
指针数组,故名思义,就是指针的数组,数组的元素是指针;
数组指针,同样,就是直想数组的指针。

简单举例说明:

int *p[2]; 首先声明了一个数组,数组的元素是int型的指针。
int (*p)[2]; 声明了一个指针, 指向了一个有两个int元素的数组。

其实这两种写法主要是因为运算符的优先级, 因为[]的优先级比*高。所以第一种写法,p先和[]结合,所以是一个数组,后与*结合,是指针。后一种写法同理。
指针数组如下处理就会很清楚:
typedef int* intPtr;
intPtr p[2];
一目了然,所以为了避免迷惑,做适当的typedef也是很有必要的。
同理,数组指针也可以作类似处理:
typedef int intArray2[2];
intArray2 * p;
和原来的声明都是等价的。
hotchen001 2009-08-10
  • 打赏
  • 举报
回复
int* p1 = new int[10]
int p2[] = {1,2,3,4,5,6,7,8,9,0];

p1是一个指针,但是p1是指向一个含有10个int型元素数组的首地址啊!
为什么sizeof(p1)=4呢?为什么不是等于4*10呢?
hotchen001 2009-08-10
  • 打赏
  • 举报
回复
按我看到那帖子的说法,
sizeof(p1)=sizeof(new int[10])=40
这里是等于40啊,zyq5945兄是等于4
hotchen001 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zyq5945 的回复:]
引用 11 楼 codewarrior 的回复:
数组(尤其数组名)和指针是相当容易弄混的东西。
比如:
int* p1 = new int[10]
int p2[] = {1,2,3,4,5,6,7,8,9,0];

你想想sizeof(p1)和sizeof(p2)分别是什么?

引用 18 楼 hotchen001 的回复:
引用 13 楼 zyq5945 的回复:
sizeof(p1)等于4;sizeof(p2)等于40。


这位大哥,小弟不知道到底错在哪啊!你给个答案给我,我还是云里雾里啊!麻烦详细点啊!

p1是一个指针,这个指针指向的是一个int类型的变量。
p2是一个数组指针,这个指针指向的是数组的首地址,这个数组有10个元素。
我也不知道说明白了没,这个问题有点像指针数组和数组指针。
int (*p3)[10];
sizeof(p3)等于40和sizeof(p2)等于40是一个道理。
[/Quote]
非常感谢zyq5945兄的详细解答,我google了一下发现有个帖子写到:
int *p=new int(10)
相当于
int *p=_new(sizeof(int)); //只配置空间
*p=10;//赋初值

int *p=new int[10]
相当于
*p=(int*)_new(10*sizeof(int));//只配置空间,是指系统分配一块连续空间,大小为10个int型
的大小,结果是这块空间的起始地址。实际上分配了一个整型
数组的空间,数组大小为10个int型,没有初始化数组的内容

而zyq5945兄的意思是与之矛盾啊!我迷惑了,到底哪个是对的呢?
zyq5945 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 codewarrior 的回复:]
数组(尤其数组名)和指针是相当容易弄混的东西。
比如:
int* p1 = new int[10]
int p2[] = {1,2,3,4,5,6,7,8,9,0];

你想想sizeof(p1)和sizeof(p2)分别是什么?
[/Quote]
[Quote=引用 18 楼 hotchen001 的回复:]
引用 13 楼 zyq5945 的回复:
sizeof(p1)等于4;sizeof(p2)等于40。


这位大哥,小弟不知道到底错在哪啊!你给个答案给我,我还是云里雾里啊!麻烦详细点啊!
[/Quote]
p1是一个指针,这个指针指向的是一个int类型的变量。
p2是一个数组指针,这个指针指向的是数组的首地址,这个数组有10个元素。
我也不知道说明白了没,这个问题有点像指针数组和数组指针。
int (*p3)[10];
sizeof(p3)等于40和sizeof(p2)等于40是一个道理。
周成风 2009-08-10
  • 打赏
  • 举报
回复
楼说的都很有道理,要么就别用new了,直接定义一个指针就行。

如果真要new个,那也不能按照数组删除。。new只是一个int变量。

a那是在栈上分配的内存,会自动回收。
stuarts740 2009-08-10
  • 打赏
  • 举报
回复
p1是指针,占四个字节(32位操作系统)
p2是数组,大小是 数组元素个数*数组元素大小
hotchen001 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zyq5945 的回复:]
sizeof(p1)等于4;sizeof(p2)等于40。

[/Quote]
这位大哥,小弟不知道到底错在哪啊!你给个答案给我,我还是云里雾里啊!麻烦详细点啊!
zoulie 2009-08-10
  • 打赏
  • 举报
回复
看看 高质量C++编程
这不是鸭头 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fishion 的回复:]
int *pArray;
int a[]={1,2,3,4,5,6};
pArray=a;
for(int i=0;i <=5;i++)
cout < <*pArray+i < <endl;   
return 0;

不需要new
[/Quote]
正解
这不是鸭头 2009-08-10
  • 打赏
  • 举报
回复
pArray=new int;
这句错了
它指向了一个int对象
之后你是用数组赋值了
副组长 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hotchen001 的回复:]
引用 8 楼 gordon3000 的回复:
pArray=new int;
你对new操作符的理解有偏差,把这行去掉,后面的delete那行也去掉。

pArray=new int;
...
pArray=a;

这简直是不能容忍的,如果在我的项目里面出现了这个东西我会破口大骂!

哈哈!不好意思,小弟学习编程没多久,见笑了,被你骂我也开心!就怕没大哥的打骂,不成才啊!
[/Quote]

哈哈哈~~~~ 我爱开玩笑,别见怪啊! ;)
zyq5945 2009-08-10
  • 打赏
  • 举报
回复
sizeof(p1)等于4;sizeof(p2)等于40。
hotchen001 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 codewarrior 的回复:]
数组(尤其数组名)和指针是相当容易弄混的东西。
比如:
int* p1 = new int[10]
int p2[] = {1,2,3,4,5,6,7,8,9,0];

你想想sizeof(p1)和sizeof(p2)分别是什么?
[/Quote]
这对我可是难题了!想了好久弄出个答案,希望codewarrior哥给个指教:
sizeof(p1)指的是指针p1指向的内存地址块(4*10个字节)
sizeof(p2)指的是数组p1的第一个元素1的内存地址大小(4个字节)
对吗?麻烦指教,最好能详细点哈,光给个答案小弟肯定云里雾里!
会思考的草 2009-08-10
  • 打赏
  • 举报
回复
数组(尤其数组名)和指针是相当容易弄混的东西。
比如:
int* p1 = new int[10]
int p2[] = {1,2,3,4,5,6,7,8,9,0];

你想想sizeof(p1)和sizeof(p2)分别是什么?
会思考的草 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hotchen001 的回复:]
谢谢各位大哥的慷慨相助!再继续这个话题发问哈!
在这段代码中pArray=new int; 之后怎样才能使pArray指向a的首地址呢?就是说要new起左右
[/Quote]
压根不需要new。说明你对指针的理解的不够深入透彻。
int* pArray = a;
加载更多回复(9)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧