由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 大侠们救命, C++ operator new 问题
相关主题
电话面试题一问 (转载)写惯了C++ code,再写C code真不习惯
三个C syntax 弱问题一个C++ operator new的重载问题
这个C++程序为什么不能运行C++ delete
A aimple C++ question一个古怪的C程序运行错误。
C++ 初级再初级问题奇怪的问题:关于一个简单的malloc()小程序 (转载)
C++ online Test 又一题 (转载) char ** pt1和 char * pt2[] 的区别在哪?
还是咱们这儿,亲。What is wrong with the code?
关于placement new为什么foo1可以而foo2不行?
相关话题的讨论汇总
话题: foo话题: new话题: operator话题: void话题: rbv
进入Programming版参与讨论
1 (共1页)
z****e
发帖数: 2024
1
代码如下:
#include
using namespace std;
class Foo{
public:
Foo(){cout<<"ctr"< void* operator new(size_t){
return pool;
}
private:
static char pool[ ];
};
char Foo::pool[sizeof(Foo)];
void* rbv(){
static char pool[sizeof(Foo)];
return pool;
}
int main(int argc, char* argv[]){
Foo *x=new Foo;//正确,输出 “ctr”
Foo *y=rbv();//错误:invalid conversion from ‘void*’ to ‘Foo*’
}
我就奇怪了,一样是返回一块内存,怎么必须是operator new()返回的就行?而一般
global函数返回的就不行呢?
t****t
发帖数: 6806
2
new Foo has type Foo*
void* has type void*
void* can't be (implicitly) cast to Foo*

【在 z****e 的大作中提到】
: 代码如下:
: #include
: using namespace std;
: class Foo{
: public:
: Foo(){cout<<"ctr"<: void* operator new(size_t){
: return pool;
: }
: private:

X****r
发帖数: 3557
3
先忽略你重载的operator new,把基本概念搞清楚。
从语法上来讲,void*不能自动转换成Foo*,这个是乌龟的屁股,所以你编译通不过,
从语义上来讲,rbv只是返回一片内存,new不仅分配内存还调用构造函数,这个赋值就
不对。
如果你想在指定的内存位置构造一个对象,用placement new:
Foo *y = new (rbv()) Foo;
如果你想强行把这片空间作为一个Foo对象来看待,用cast:
Foo *y = (Foo *) rbv();
但是后者这样的话你使用y的时候什么都可能发生。

【在 z****e 的大作中提到】
: 代码如下:
: #include
: using namespace std;
: class Foo{
: public:
: Foo(){cout<<"ctr"<: void* operator new(size_t){
: return pool;
: }
: private:

X****r
发帖数: 3557
4
我就知道你一定比我快!

【在 t****t 的大作中提到】
: new Foo has type Foo*
: void* has type void*
: void* can't be (implicitly) cast to Foo*

z****e
发帖数: 2024
5
这个就是我百思不得其解所在。
1.new 我给重载了,也是返回一个 void*.和rbv一样的呀!
2.这个new,不就是一个普普通通的成员函数么?
我给他换个名字,就不行了?
是不是因为new是C++的一个保留字,所以,其重载以后的行为还有我所不能控制的地方?

【在 t****t 的大作中提到】
: new Foo has type Foo*
: void* has type void*
: void* can't be (implicitly) cast to Foo*

z****e
发帖数: 2024
6
大侠们太快了,我这还没来得及早谢呢,就回帖了。
z****e
发帖数: 2024
7
哦,我好像明白了,就是说,这个new是C++保留字,它本身有很多幕后操作对吧?
所以对new的重载,并不是一个简单的定义就完了,我虽然给了new的定义,但是编译器
会自动加一些东西是吧?
而那个rbv(),由于不是保留字,就一个草民,我写的,就是它干的事情,没有幕后
的后台,所以就被“龟腚”了对吧?

【在 X****r 的大作中提到】
: 先忽略你重载的operator new,把基本概念搞清楚。
: 从语法上来讲,void*不能自动转换成Foo*,这个是乌龟的屁股,所以你编译通不过,
: 从语义上来讲,rbv只是返回一片内存,new不仅分配内存还调用构造函数,这个赋值就
: 不对。
: 如果你想在指定的内存位置构造一个对象,用placement new:
: Foo *y = new (rbv()) Foo;
: 如果你想强行把这片空间作为一个Foo对象来看待,用cast:
: Foo *y = (Foo *) rbv();
: 但是后者这样的话你使用y的时候什么都可能发生。

X****r
发帖数: 3557
8
你得到它了。你重载的operator new和你调用的new expression不是一回事。

【在 z****e 的大作中提到】
: 哦,我好像明白了,就是说,这个new是C++保留字,它本身有很多幕后操作对吧?
: 所以对new的重载,并不是一个简单的定义就完了,我虽然给了new的定义,但是编译器
: 会自动加一些东西是吧?
: 而那个rbv(),由于不是保留字,就一个草民,我写的,就是它干的事情,没有幕后
: 的后台,所以就被“龟腚”了对吧?

t****t
发帖数: 6806
9
(new Foo) is not equivalent to (Foo::operator new).
new Foo will do following:
call Foo::operator new(sizeof(Foo)). if not found, call ::operator new(
sizeof(Foo)). [5.3.4, 8]
then call Foo::Foo() for the allocated space.[5.3.4, 15].
then returns Foo*.

方?

【在 z****e 的大作中提到】
: 这个就是我百思不得其解所在。
: 1.new 我给重载了,也是返回一个 void*.和rbv一样的呀!
: 2.这个new,不就是一个普普通通的成员函数么?
: 我给他换个名字,就不行了?
: 是不是因为new是C++的一个保留字,所以,其重载以后的行为还有我所不能控制的地方?

t****t
发帖数: 6806
10
因为你太能说了...

【在 X****r 的大作中提到】
: 我就知道你一定比我快!
相关主题
C++ online Test 又一题 (转载)写惯了C++ code,再写C code真不习惯
还是咱们这儿,亲。一个C++ operator new的重载问题
关于placement newC++ delete
进入Programming版参与讨论
X****r
发帖数: 3557
11
一般一般,第二轮你比较能说,就慢了,呵呵。

【在 t****t 的大作中提到】
: 因为你太能说了...
z****e
发帖数: 2024
12
大侠们的指点真是让我拨云见日啊!
多么愉快的一个周末呀。
z****e
发帖数: 2024
13
你们两不当版主,真是mitbbs的失败。
z****e
发帖数: 2024
14
你这个英文已经达到了如火纯情的境界了呀,you got it,你就来个 “你得到它了。”
lol。
那要是 got you,就是 得到你了?

【在 X****r 的大作中提到】
: 你得到它了。你重载的operator new和你调用的new expression不是一回事。
g***j
发帖数: 1275
15
operator new is different from new operator
The new in new expression is new operator.
the new you override is operator new.
operator new is same as malloc, which returns void*.

【在 z****e 的大作中提到】
: 代码如下:
: #include
: using namespace std;
: class Foo{
: public:
: Foo(){cout<<"ctr"<: void* operator new(size_t){
: return pool;
: }
: private:

1 (共1页)
进入Programming版参与讨论
相关主题
为什么foo1可以而foo2不行?C++ 初级再初级问题
菜鸟求教,一个c++的困惑C++ online Test 又一题 (转载)
C的argc问题还是咱们这儿,亲。
一个nested class的问题关于placement new
电话面试题一问 (转载)写惯了C++ code,再写C code真不习惯
三个C syntax 弱问题一个C++ operator new的重载问题
这个C++程序为什么不能运行C++ delete
A aimple C++ question一个古怪的C程序运行错误。
相关话题的讨论汇总
话题: foo话题: new话题: operator话题: void话题: rbv