读书人

关于new和delete的有关问题

发布时间: 2012-02-21 16:26:23 作者: rapoo

关于new和delete的问题
看书上说了用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++是如何区分只有一个元素的数组的?

先谢谢各位了!

[解决办法]
我觉得分配得方式应该是一样得,只是一个针对对象,一个针对对象数组
[解决办法]
pBuffer = new char[1]



pBuffer = new char;

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

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

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

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

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

对你来说,按规则办事就可以了
[解决办法]
LS已经说得很明白了。对数组来说,因为编译器会保存一个长度,所以一个或N个元素的数组,编译器都是一样处理。
[解决办法]
100分好诱人啊,只可惜星羽捷足先登了,而且还回答的那么完善,我实在没法插嘴了,呵呵

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

int iTemp = 0;
...

pBuffer = new char[iTemp];

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

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

const int iTemp = 20;
pBuffer = new char[iTemp];
......
delete [] pBuffer;
[解决办法]
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
[解决办法]
pBuffer = new char[1]与pBuffer = new char的最根本区别在于调用的分配函数是不一样的。

一个是operator new[],另一个是operator new。分配多少空间并不是问题的关键。

读书人网 >C++

热点推荐