求c++牛人指导c++中的new[] 和 new有关问题

求c++牛人指导c++中的new[] 和 new问题
本人对c++不是很熟悉,现在有一个问题需要高人指导:

在c++中申请动态内存有operation new[]和operation new,对于new[]申请的内存块由delete[]释放,new则是delete。

  我现在所研究的一个问题是分别获取c++程序中的new[]和new的相关信息。以linux平台为例,经过编译汇编以后new[]被编译成底层符号_Znaj,new则编译成_Znwj,我获取到这两个操作符号信息,然后进行测试,发现当程序中调用new[]和delete[]的时候,同样还会再去调用一次new和delete,有大牛知道这是什么原因吗?

  例如我在程序中只采用int *p = new int[3]分配内存,在我所做的工具中就会获取到_Znaj,并且传入_Znaj的参数为12,同时也获取到_Znwj,参数也为12。但是如果采用new分配时,只获取_Znwj,对于采用new[]申请的内存为什么还会再调用一次new呢,而且传入的参数大小也是一样,求高人指点,谢谢!

------解决方案--------------------
无论是new [] 还是new到后面的释放的代码都是一样的。对于operator new[]和operator new来说传递的都是分配的原始内存的大小这个参数。所以底层的代码是可以共用的。
------解决方案--------------------
new/delete和new[]/delete[]之间区别。

首先要明白 new/delete 和operator new()/delete()不是一回事。
new/delete 是加上编译处理,然后调用operator new()/delete().
对new[]/delete[]来说一样。

编译器的处理过程。

对于基本类型来说,这2者的处理是一致的。(int char float bool 这些)
就是简单的调用operator new/delete () 分配释放一定长度内存。
没有额外的处理。

对于自定义类型struct/class 来说。 这里假设对象没有重载operator new[]()/delete[]()

byte * p=(byte*)new[](size+sizeof(size_t));
new[]时 先用operator new[]()分配一块比给定长度大一点的内存,此处为size+sizeof(size_t)

*(size_t*)p=count_of_objects; 
p+=sizeof(size_t);

第一个size_t 里面存入元素个数。

count_of_objects编译器知道,global new[]operator()永远不知道,成员函数new[]可以计算出个数,但是如果有人以继承new[]()方式使用的话,个数会是一个无效值。

for(int i=0;i<count_of_objects;++i)
new (p+sizeof(obj)*i) obj(parms...);

然后循环调用每个对象的构造函数。

最后return p给调用者。


delete[]时反过来

byte*p 参数.

p-=sizeof(size_t);

size_t count=*(size_t*)p;

for(int i=0;i<count;++i)
(obj*)(p+(sizeof(obj)*i))->~obj();

delete[](p);



一般情况下new()和new[]()是同一个函数,delete()和delete[]()是同一个函数。
处于调试的目的有时会指向不同函数。

因为new/new[] 以及delte/delete[] 处理过程的不同,混用这2种操作符将会出现不可预计的错误。