关于new的疑问?
#include <malloc.h>
#include <memory.h>
class Blanks
{
public:
Blanks(){}
void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
void *pvTemp = malloc( stAllocateBlock );
if( pvTemp != 0 )
memset( pvTemp, chInit, stAllocateBlock );
return pvTemp;
}
int main()
{
Blanks *a5 = new( 0xa5 ) Blanks;
return a5 != 0;
}
主函数的new是类中new操作符重载。
但是new后面只有一个参数0xa5,
而类中函数的声明是void *operator new( size_t stAllocateBlock, char chInit );两个参数。
怎么会调用这个类内的呢?
问题点数:20、回复次数:7Top
1 楼triace_zhang(『雪梨码头』)回复于 2006-06-03 21:36:17 得分 0
Blanks *a5 = new( 0xa5 ) Blanks;
定位new,在指定的地址( 0xa5 )直接建立一个对象.Top
2 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-06-03 21:48:02 得分 0
学习了...
实验一下·Top
3 楼sharpdew(风刃)回复于 2006-06-03 22:08:13 得分 20
呵呵,你难道没有看到是两个参数吗?
Blanks *a5 = new( 0xa5 ) Blanks;
一个是 0xa5被当作char了,Blanks就是对应内存大小的那个参数呀!
这是最基本的知识了,要不知道,你怎么知道重载new的呢Top
4 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-06-03 22:11:43 得分 0
// Blanks *a5 = new( 0xa5 ) Blanks;
-----------
长见识了!·!Top
5 楼sharpdew(风刃)回复于 2006-06-03 22:37:35 得分 0
再顺便说一下,类里面的new操作会覆盖全局的new,所以会出现这种现象:
Blanks *a5 = new( 0xa5 ) Blanks; // ok, call new(size_t,char) in the class
a5 = new Blanks; // error, can not find a new()Top
6 楼zhangzhm()回复于 2006-06-03 23:12:48 得分 0
看这个文章就彻底明白了。
http://www.cppblog.com/alantop/archive/2006/06/03/8131.htmlTop
7 楼luvybird()回复于 2006-06-04 00:23:12 得分 0
当void *Blanks::operator new( size_t stAllocateBlock, char chInit )
改写为void *Blanks::operator new( size_t stAllocateBlock, void * location )
才是在0xa5的地址上建立对象
Top




