关于new和delete的问题

Archlich_Lao 2007-09-16 04:00:06
看书上说了用new分配的内存应该用delete删除,用new []分配的内存应该用delete []删除,假如我想申请一段内存,下面是代码:

char * pBuffer = 0;
int iTemp = 0;
...

pBuffer = new char[iTemp];

...

delete [] pBuffer;
pBuffer = 0;

上面的做法应该没有错吧?
我想问一下,如果 iTemp = 1 时,也就是 pBuffer = new char[1] ,这种申请内存的方式与pBuffer = new char 有区别吗?它们应该都申请了一个字节的内存但是在编写方式上不同,当iTemp = 1时,用delete 删除和用delete [] 删除的区别是什么呢?

或者简单的说C++是如何区分只有一个元素的数组的?

先谢谢各位了!
...全文
118 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fish6344 2007-09-17
  • 打赏
  • 举报
回复
莫关系!
Archlich_Lao 2007-09-17
  • 打赏
  • 举报
回复
先谢谢fish6344()啊,但是很遗憾啊,我揭帖的时候没有看见你的帖子,所以没办法给你分了,抱歉了...
fish6344 2007-09-16
  • 打赏
  • 举报
回复
关于C++是如何区分只有一个元素的数组的?

当你使用数组的new操作时,new其实调用了如下全局的重载new[]操作符函数,其原型如下:

void * operator new[](size_t) throw(bad_alloc)
(见《C++ Common Knowledge》条款37-数组分配 page97)

其中的size_t可以认为就是数组的维度信息。所以说当如下语句出现时:

pBuffer = new char[iTemp];

其中的"[iTemp]"实际上是告诉了编译器new的结果pBufer指向的是一个数组,编译器将以联合数组或类似数据结构去保存和管理pBufer指向数组的维度信息,以备将来在:

delete[] pBuffer;

出现的时候,依靠这些信息去释放内存资源!
(参考《Inside The C++ Object Model》page257)

所以要明确的告诉编译器你的pBuffer上new的是一个数组,即使它是一个只有1个元素的数组,请用"new[]"与"delete[]"!(否则视编译器的不同,有不可预见的结果)
Leon8086 2007-09-16
  • 打赏
  • 举报
回复
pBuffer = new char[1]与pBuffer = new char的最根本区别在于调用的分配函数是不一样的。

一个是operator new[],另一个是operator new。分配多少空间并不是问题的关键。
yydrewdrew 2007-09-16
  • 打赏
  • 举报
回复
pBuffer = new char[1]
pBuffer = new char
似乎对象和数组都将分配记录空间大小的内存小块绑定在分配内存的地址头部。
至少vc6是这样的,vc6好像是在数组首地址-4*sizeof(int)的内存中。
#include<iostream>
using namespace std;

int main()
{
char *array = new char[4];
cout<<"the size of char array is:"
<<*reinterpret_cast<int*>(reinterpret_cast<char*>(array) - 4 * sizeof(int))
<<endl;
char *p = new char;
cout<<"the size of char is:"
<<*reinterpret_cast<int*>(reinterpret_cast<char*>(p) - 4 * sizeof(int))
<<endl;
return 0;
}

你将char *p = new char;改成:int *p = int char;输出会变成4
独孤过儿 2007-09-16
  • 打赏
  • 举报
回复
100分好诱人啊,只可惜星羽捷足先登了,而且还回答的那么完善,我实在没法插嘴了,呵呵

不过,仔细看看还是发现了点小瑕疵,

int iTemp = 0;
...

pBuffer = new char[iTemp];

最好不要这样分配内存,这样给人的感觉是 你认为申请的内存长度可以动态变化,而实际上它

是不可变的。申请内存的时候必须确定指明申请多大的空间,可以这样:

const int iTemp = 20;
pBuffer = new char[iTemp];
......
delete [] pBuffer;
vcPlayer 2007-09-16
  • 打赏
  • 举报
回复
LS已经说得很明白了。对数组来说,因为编译器会保存一个长度,所以一个或N个元素的数组,编译器都是一样处理。
星羽 2007-09-16
  • 打赏
  • 举报
回复
pBuffer = new char[1]



pBuffer = new char;

对用户来说基本没区别,但对编译器来说就不一定了

对于这种 pBuffer = new char[1]类型,编译器会

保存一个数组长度,比如上面的1,至于这些信息存在

那里,不同的编译器做法不同,vc的就存在分配到的

空间的前面, 等等,这些你可以不需要去深究,

对你来说,按规则办事就可以了
ming4098 2007-09-16
  • 打赏
  • 举报
回复
我觉得分配得方式应该是一样得,只是一个针对对象,一个针对对象数组

64,651

社区成员

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

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