没搞清刚才的delete

ocean1004 2009-06-18 03:16:40
char* pBuf = new char[100];
int* pInt = (int*)pBuf;
delete pInt;
没有内存泄露,但是用法对吗?

引一回帖:
int* pInt的空间是在栈中分配的
char* pBuf的空间也是在栈中分配的,但是pBuf指向的内容是在堆中分配的
堆中分配的内存才需要手动释放

原帖见 http://topic.csdn.net/u/20090618/13/6395f807-241d-4672-9913-19a98604d849.html?1384125677

难道pInt指向的不是堆中分配的内存?delete pInt应该完全和delete pBuf一样啊。
如果不一样的话,那下面代码是否也是错误的?
char* pBuf = new char[100];
char* pBuf2 = pBuf;
delete []pBuf2;
...全文
18 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodname 2009-06-18
  • 打赏
  • 举报
回复
最后一句似乎有些不太严密,新旧类型不同说的不包括继承。是说两种完全不同的类型。
心理是这么想的,表达的不好,补充以下。
goodname 2009-06-18
  • 打赏
  • 举报
回复
char* pBuf = new char[100];
char* pBuf2 = pBuf;
delete []pBuf2;//这是合法的。

对于内置数据类型即使掉了[],使用delete pBuf2应该也没有内存泄露,但是不符合语法规范。
如果说
int* pBuf2 = (int*)pBuf;
delete []pBuf2;
估计也能行。但是最好不要这样做。

其实我觉得其释放内存的原理是,在你申请的这块区域的前面或者后面(一般是前面)应该有一块小小的管理区域,有的书上叫cookie,用于系统管理这些内存的。
所以只要指针保持不变,应该总能释放。有的数据结构的书上讲过内存管理策略的例子。

但是站在c++的角度上来讲,对于自定义数据类型,delete还用来调用析购函数,如果新指针类型和原类型不同,或者掉了[](也许是增加了[])都会引起析购函数执行不正确,从而引起错误。

个人理解。
pengzhixi 2009-06-18
  • 打赏
  • 举报
回复
char* pBuf = new char[100];
int* pInt = (int*)pBuf;
delete pInt;
没有内存泄露,但是用法对吗?

用法肯定错了,行为未定义.你将那块堆内存里面的数据解释为int 型,我估计在释放的时候可能会破坏其他堆内存.

char* pBuf = new char[100];
char* pBuf2 = pBuf;
delete []pBuf2;
这样没问题.只要pBuf2里面的地址始终是new返回的地址就OK
光宇广贞 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 lingyin55 的回复:]
顺便也赔我一点吧。。^_^


引用 24 楼 hikaliv 的回复:
引用 23 楼 ocean1004 的回复:
引用 22 楼 hikaliv 的回复:
完了,丢脸了……


。。。。。。。。。。。。。。。。。。。
害我郁闷了好久


我赔你吧……没看清楚……说得太快了……
[/Quote]

等着我散分吧,马上升星了……
lingyin55 2009-06-18
  • 打赏
  • 举报
回复
顺便也赔我一点吧。。^_^

[Quote=引用 24 楼 hikaliv 的回复:]
引用 23 楼 ocean1004 的回复:
引用 22 楼 hikaliv 的回复:
完了,丢脸了……


。。。。。。。。。。。。。。。。。。。
害我郁闷了好久



我赔你吧……没看清楚……说得太快了……
[/Quote]
lingyin55 2009-06-18
  • 打赏
  • 举报
回复
另外,对于基本类型,用delete和delete[]释放一个new char[100];应该是可以的,
但是建议不要这样使用,因为这只对基本类型而言。对于自定义类可能就有问题了。
具体可以参见5楼给出的链接。
而且Effective C++ 也说过,new 和 delete 要使用同样的形式



[Quote=引用楼主 ocean1004 的帖子:]
char* pBuf = new char[100];
int* pInt = (int*)pBuf;
delete pInt;
没有内存泄露,但是用法对吗?

引一回帖:
int* pInt的空间是在栈中分配的
char* pBuf的空间也是在栈中分配的,但是pBuf指向的内容是在堆中分配的
堆中分配的内存才需要手动释放

原帖见 http://topic.csdn.net/u/20090618/13/6395f807-241d-4672-9913-19a98604d849.html?1384125677

难道pInt指向的不是堆中分配的内存?delete pInt应…
[/Quote]
光宇广贞 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 ocean1004 的回复:]
引用 22 楼 hikaliv 的回复:
完了,丢脸了……


。。。。。。。。。。。。。。。。。。。
害我郁闷了好久
[/Quote]

我赔你吧……没看清楚……说得太快了……
ocean1004 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 hikaliv 的回复:]
完了,丢脸了……
[/Quote]
。。。。。。。。。。。。。。。。。。。
害我郁闷了好久
光宇广贞 2009-06-18
  • 打赏
  • 举报
回复
完了,丢脸了……
光宇广贞 2009-06-18
  • 打赏
  • 举报
回复
是我错了……我没看清楚……

对……你说得对……
lingyin55 2009-06-18
  • 打赏
  • 举报
回复
pBuf2和pBuf应该都是栈上分配内存的,但是new char[100];
是在堆上分配内存,如果按照你的说法,那么delete []pBuf也有问题了。
delete是对指针指向的内存而言,并不对指针本身。



[Quote=引用 16 楼 hikaliv 的回复:]
引用 14 楼 lingyin55 的回复:
呃,delete []pBuf2; 是对的吧,delete的对象是pBuf2指向的内存,而不是pBuf2本身。


引用 9 楼 hikaliv 的回复:
同学……你一定要明确一点,数组是分配到栈中的,你无论用什么指针去指它,也不可以delete,这是非法的,会造成不可想像的问题。

你换着花样去用什么指针去指它,而后试图 delete 的做法都是无用的。

像你这种操作。
char* pBuf = new char[100];
char* pBuf2 = …
[/Quote]
ocean1004 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hikaliv 的回复:]
同学……你一定要明确一点,数组是分配到栈中的,你无论用什么指针去指它,也不可以delete,这是非法的,会造成不可想像的问题。

你换着花样去用什么指针去指它,而后试图 delete 的做法都是无用的。

像你这种操作。
char* pBuf = new char[100];
char* pBuf2 = pBuf;
delete []pBuf2;

最后一步delete 是非法的。

不要以为定义了一个指针类型变量,只要它指向了一个东西就需要去 delete ,你要明确的是,它指的东…
[/Quote]
我不知道是我没理解你的意思,还是你没理解我的意思。
最后一步delete是非法的?
pBuf2指的不是栈里的数组,是堆里的东西,和pBuf完全一样啊。

如果这步都是非法的,那我们申请堆内存后char* pBuf = new char[100],要删除内存就只能靠pBuf这个指针了。但是pBuf是个局部变量啊。怎么可能保留下来,如果在跨函数的地方。

像向新建的线程传参就出错了,按照你这样说。
adventurelw 2009-06-18
  • 打赏
  • 举报
回复
pBuf2并没有重新分配动态空间,指向的就是pBuf指向的空间,尽管它本身需要四个字节存储地址,这是在栈上的
所以
delete [] pBuf2 和 delete [] pBuf是一样的。
padiu01 2009-06-18
  • 打赏
  • 举报
回复
栈分配有两个关键特征
1):当用户定义一个局部变量,就要在堆栈结构中整个变量分配足够的空间,不论他是变量还是一个大型数组,还是一个数据结构
2):在程序运行到栈结构变量的作用范围之外时,他们占用的内存被自动释放
我的理解:
char* pBuf = new char[100];有new,那么堆内就为数组分配了空间,所以需要手动delete
char* pBuf2 = pBuf;这里你需要判断pBuf2 ,是在堆里的还是栈里的,那么看他是不是用户定义的一个局部变量,经判断,pBuf2 是一个局部变量,那么他是存放在栈里面的,因此程序运行到栈结构变量作用范围外的时候,就会被内存自动释放
总结:自己new出来的东西要自己手动释放掉,其余的一般你可以不用特别去delete
光宇广贞 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lingyin55 的回复:]
呃,delete []pBuf2; 是对的吧,delete的对象是pBuf2指向的内存,而不是pBuf2本身。


引用 9 楼 hikaliv 的回复:
同学……你一定要明确一点,数组是分配到栈中的,你无论用什么指针去指它,也不可以delete,这是非法的,会造成不可想像的问题。

你换着花样去用什么指针去指它,而后试图 delete 的做法都是无用的。

像你这种操作。
char* pBuf = new char[100];
char* pBuf2 = pBuf;
delete []pBuf2;

最后…
[/Quote]

那个……栈内存量可以delete[]的么……可以这么着么?……
adventurelw 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ocean1004 的回复:]
引用 4 楼 adventurelw 的回复:
pInt和pBuf指向的是同一块内存,但解释方式不一样,前者四个字节为一单位;后者每一字节为一单位
new[]要和delete[]配合。


释放单位不同会有什么区别?

按照这样的理论的话
char* pBuf = new char[101];
int* pInt = (int*)pBuf;
delete pInt;
应该泄露一字节的内存?我试验了下,好像没泄露。
[/Quote]
内存泄露不是什么时候都会出问题吧
delete pInt只能释放pInt所指地址及其后总共4个字节的内存。因为它就是释放一个动态分配的int空间。
毕竟现在的内存也不是一两兆了。
lingyin55 2009-06-18
  • 打赏
  • 举报
回复
呃,delete []pBuf2; 是对的吧,delete的对象是pBuf2指向的内存,而不是pBuf2本身。

[Quote=引用 9 楼 hikaliv 的回复:]
同学……你一定要明确一点,数组是分配到栈中的,你无论用什么指针去指它,也不可以delete,这是非法的,会造成不可想像的问题。

你换着花样去用什么指针去指它,而后试图 delete 的做法都是无用的。

像你这种操作。
char* pBuf = new char[100];
char* pBuf2 = pBuf;
delete []pBuf2;

最后一步delete 是非法的。

不要以为定义了一个指针类型变量,只要它指向了一个东西就需要去 delete ,你要明确的是,它…
[/Quote]
lingyin55 2009-06-18
  • 打赏
  • 举报
回复
如果不一样的话,那下面代码是否也是错误的?
char* pBuf = new char[100];
char* pBuf2 = pBuf;
delete []pBuf2;

这个是对的,而且常会这样用到,比如pBuf可能会被改变,释放的时候就比较麻烦,
这时会定义一个pBuf2先保存pBuf,即使pBuf改变了,释放的时候只需释放pBuf2就行。
ocean1004 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 adventurelw 的回复:]
pInt和pBuf指向的是同一块内存,但解释方式不一样,前者四个字节为一单位;后者每一字节为一单位
new[]要和delete[]配合。
[/Quote]

释放单位不同会有什么区别?

按照这样的理论的话
char* pBuf = new char[101];
int* pInt = (int*)pBuf;
delete pInt;
应该泄露一字节的内存?我试验了下,好像没泄露。
tkminigame 2009-06-18
  • 打赏
  • 举报
回复
char* pBuf这个是不需要delete的,不管你声明在哪里。真正需要delete的是new char[100],怎么delete?通过delete[] pBuf。
加载更多回复(10)

64,283

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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