注册 登录
编程论坛 C++教室

Auto_ptr以及模版的问题

lyj123 发布于 2012-11-18 16:30, 442 次点击
class Trace{
 void *operator new(size_t sz){
    void *p=::operator new(sz);
    return p;
 }
};
auto_ptr<Trace> mine(new Trace);
mine(这里为什么可以填写且一定要填new Trace(...))
或者换种写法
Trace * p=new Trace;
auto_ptr<Trace>mine(p);
程序通过,但是
void* p=new Trace;
auto_ptr<Trace>mine(p);
出错!!
为什么
operator new 里面返回的不是void*类型吗?请求指点
7 回复
#2
lyj1232012-11-18 19:54
没人懂嘛?
#3
rjsp2012-11-19 08:49
std::auto_ptr<Trace>的构造函数参数要求是 Trace* 类型,你给个 void* 当然会编译不通过啦

如果不加限制,岂不是 auto_ptr<Trace> mine( new double );也可以编译通过?
#4
liufashuai2012-11-19 15:20
operator new 里面返回的不是void*类型吗?请求指点
哥们,operator new返回void *只是在你定义的类中的new操作符重载,而你要给智能指针赋值必须是一个指针
而且是一个指向你定义的类的对象的指针,但是你的类还没有实例化,怎么可能使用里面的函数,要理清思路
这个new还是正常的new 是先申请空间然后调用类的构造函数。还不是你自己重载的那个new操作符,那个只是在你的类有效范围内使用有效
#5
lyj1232012-11-24 12:44
以下是引用liufashuai在2012-11-19 15:20:25的发言:

哥们,operator new返回void *只是在你定义的类中的new操作符重载,而你要给智能指针赋值必须是一个指针
而且是一个指向你定义的类的对象的指针,但是你的类还没有实例化,怎么可能使用里面的函数,要理清思路
这个new还是正常的new 是先申请空间然后调用类的构造函数。还不是你自己重载的那个new操作符,那个只是在你的类有效范围内使用有效
new运算符的操作顺序是不是这样:编译器首先检查到new,发现后面跟着Trace类型,算出Trace类的大小传递给(已经重载的)new运算符(函数),调用完成后开辟一个内存单元并返回它,再调用Trace()构造函数?
    new Trace   这个表达式得到的是一个Trace*类型吗?
#6
lyj1232012-11-25 16:35
来人说下 new的执行过程啊,是不是我想的这样
#7
lz10919149992012-11-26 10:48
先分配空间,然后调用构造函数,最后返回,返回值那里也肯定加了static_cast,不然你觉得C++会允许把void*赋值给某一确定类型的指针吗?
#8
lyj1232012-12-04 19:50
回复 7楼 lz1091914999
By the way,static functions 是属于类的,为什么new 和delete 是static 的  
1