由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - one question about operator delete
相关主题
问一个empty class的size的问题急问:compile and build dependency
C++弱问find bugs of c++ codes
a c++ question没有经过构造函数???
一道c++的考古题C++ Q20: construction and inheritance
经典C++问题求助请教一个c++ throw exception 问题
请问关于c++实现singleton的问题?我这个C++程序有没有什么问题啊?请指点。。。谢谢。。。
C++问题几个C++的一个小疑问,求解惑
C++ 书推荐一个C++面试题分析
相关话题的讨论汇总
话题: delete话题: testdelete话题: operator话题: dtor话题: std
进入Programming版参与讨论
1 (共1页)
x*********h
发帖数: 25
1
Hi, I have a question about operator delete, dtor.
define a class like below,
class TestDelete{
public:
virtual ~TestDelete(){
std::cout << "TestDelete::~TestDelete" << std::endl;
}
void operator delete (void* p){
std::cout << "TestDelete::operator delete()" << std::endl;
}
// void operator delete[] (void* p){
// std::cout << "TestDelete::operator delete()" << std::endl;
// }
};
then, write statements like :
TestDelete* p = NULL;
delete p;
I found
d*******d
发帖数: 2050
2
我猜测啊,在你有virtual dtor的情况时,你delete 的时候,要先走dtor,然后是clas
s里面的delete,可是你delete了一个null,编译器无法从null找到vtable然后fetch出dt
or,所以直接就完了,没有走下去。
而你注释掉virtual dtor后,走的是default dtor,default dtor不用走vtable,所以总
是call了,default dtor没做什么,但是又接着call delete。

【在 x*********h 的大作中提到】
: Hi, I have a question about operator delete, dtor.
: define a class like below,
: class TestDelete{
: public:
: virtual ~TestDelete(){
: std::cout << "TestDelete::~TestDelete" << std::endl;
: }
: void operator delete (void* p){
: std::cout << "TestDelete::operator delete()" << std::endl;
: }

s**********b
发帖数: 7
3
这个仍然是base class, 所以有没有virtual效果一样,跟virtual没关系
c++处理delete null pointer,是直接忽略的(C是crash),所以当你自己写dtor
系统会调用你的dtor,系统会知道你这个是null ptr,所以直接忽略delete p;
如果你不自己写dtor,系统掉methods是直接class methods存的address+offset找
methods,所以delete被当作普通methods调用,就会不会忽略delete call. (我不确定
,不过好象解释的通)

clas
dt

【在 d*******d 的大作中提到】
: 我猜测啊,在你有virtual dtor的情况时,你delete 的时候,要先走dtor,然后是clas
: s里面的delete,可是你delete了一个null,编译器无法从null找到vtable然后fetch出dt
: or,所以直接就完了,没有走下去。
: 而你注释掉virtual dtor后,走的是default dtor,default dtor不用走vtable,所以总
: 是call了,default dtor没做什么,但是又接着call delete。

S*********g
发帖数: 5298
4
what compiler do you use?
on g++, virtual or not, neither destructor nor delete is called.

【在 x*********h 的大作中提到】
: Hi, I have a question about operator delete, dtor.
: define a class like below,
: class TestDelete{
: public:
: virtual ~TestDelete(){
: std::cout << "TestDelete::~TestDelete" << std::endl;
: }
: void operator delete (void* p){
: std::cout << "TestDelete::operator delete()" << std::endl;
: }

t****t
发帖数: 6806
5
in C, free(NULL) is legal as well.

【在 s**********b 的大作中提到】
: 这个仍然是base class, 所以有没有virtual效果一样,跟virtual没关系
: c++处理delete null pointer,是直接忽略的(C是crash),所以当你自己写dtor
: 系统会调用你的dtor,系统会知道你这个是null ptr,所以直接忽略delete p;
: 如果你不自己写dtor,系统掉methods是直接class methods存的address+offset找
: methods,所以delete被当作普通methods调用,就会不会忽略delete call. (我不确定
: ,不过好象解释的通)
:
: clas
: dt

d*******d
发帖数: 2050
6
我试验了一下,只要自己写了dtor,无论是不是virtual的,delete都忽略了。
如果没有写dtor, delete执行了。
你的解释还是不够清楚,我还是很困惑。
自己不写dtor,系统也得先call default dtor啊,这个时候系统也会知道这是个null p
tr,也可以忽略delete啊。

【在 s**********b 的大作中提到】
: 这个仍然是base class, 所以有没有virtual效果一样,跟virtual没关系
: c++处理delete null pointer,是直接忽略的(C是crash),所以当你自己写dtor
: 系统会调用你的dtor,系统会知道你这个是null ptr,所以直接忽略delete p;
: 如果你不自己写dtor,系统掉methods是直接class methods存的address+offset找
: methods,所以delete被当作普通methods调用,就会不会忽略delete call. (我不确定
: ,不过好象解释的通)
:
: clas
: dt

s**********b
发帖数: 7
7
如果没有involve instance variable,就没关系,即使是null pointer也无所谓
因为不需要使用到object的address(这个是没有的)

p

【在 d*******d 的大作中提到】
: 我试验了一下,只要自己写了dtor,无论是不是virtual的,delete都忽略了。
: 如果没有写dtor, delete执行了。
: 你的解释还是不够清楚,我还是很困惑。
: 自己不写dtor,系统也得先call default dtor啊,这个时候系统也会知道这是个null p
: tr,也可以忽略delete啊。

s**********b
发帖数: 7
8
不过会crash

【在 t****t 的大作中提到】
: in C, free(NULL) is legal as well.
t****t
发帖数: 6806
9
your programming environment has problem. free(NULL) will not cause crash.

【在 s**********b 的大作中提到】
: 不过会crash
d****2
发帖数: 6250
10
I think in C++ the compiler can optimize using language semantics. Thus
relying on side-effects of those special functions (ie, change their meaning
) is unpredictable and not a good way to program.
p****o
发帖数: 1340
11
for g++, if you comment out the dtor, the delete will be called.
i don't know why.

【在 S*********g 的大作中提到】
: what compiler do you use?
: on g++, virtual or not, neither destructor nor delete is called.

s**********b
发帖数: 7
12
Thanks to this post, I probe what under the hood for inline func. call.
There are two cases:
case 1: with ctor.(by user)
case 2: without ctor.
compiler deals with those two cases differently, preprocessor as the same.
For preprocessor:
case 1: with ctor, preprocessor create "macro"s for inline functions, inline
functions (overridden operator delete function) will be called via macro.
In this case, operator delete will NOT be called by overhead or "this". C++
treat your call as delete NULL point

【在 s**********b 的大作中提到】
: 这个仍然是base class, 所以有没有virtual效果一样,跟virtual没关系
: c++处理delete null pointer,是直接忽略的(C是crash),所以当你自己写dtor
: 系统会调用你的dtor,系统会知道你这个是null ptr,所以直接忽略delete p;
: 如果你不自己写dtor,系统掉methods是直接class methods存的address+offset找
: methods,所以delete被当作普通methods调用,就会不会忽略delete call. (我不确定
: ,不过好象解释的通)
:
: clas
: dt

w****g
发帖数: 4
13
从编译器产生的代码看,有dtor时, 检查是否为0,是0则马上返回。
没有dtor时,直接调operator delete()
不知道这样设计有什么依据

【在 x*********h 的大作中提到】
: Hi, I have a question about operator delete, dtor.
: define a class like below,
: class TestDelete{
: public:
: virtual ~TestDelete(){
: std::cout << "TestDelete::~TestDelete" << std::endl;
: }
: void operator delete (void* p){
: std::cout << "TestDelete::operator delete()" << std::endl;
: }

d****2
发帖数: 6250
14

dtor is object-specific. must check first.
now after free object-specific space, free the space the object itself in
heap (space usage sizeof(object)), that will check NULL pointer there so no
need to check before calling delete.
Basically it is implementation-specific based on delete semantic in C++.

【在 w****g 的大作中提到】
: 从编译器产生的代码看,有dtor时, 检查是否为0,是0则马上返回。
: 没有dtor时,直接调operator delete()
: 不知道这样设计有什么依据

1 (共1页)
进入Programming版参与讨论
相关主题
一个C++面试题分析经典C++问题求助
C++设计疑问请问关于c++实现singleton的问题?
几个C++书写风格疑问C++问题几个
一个简单的小问题C++ 书推荐
问一个empty class的size的问题急问:compile and build dependency
C++弱问find bugs of c++ codes
a c++ question没有经过构造函数???
一道c++的考古题C++ Q20: construction and inheritance
相关话题的讨论汇总
话题: delete话题: testdelete话题: operator话题: dtor话题: std