Redian新闻
>
one question about operator delete
avatar
one question about operator delete# Programming - 葵花宝典
x*h
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
avatar
d*d
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;
: }

avatar
s*b
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。

avatar
S*g
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;
: }

avatar
t*t
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

avatar
d*d
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

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

p

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

avatar
s*b
8
不过会crash

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

【在 s**********b 的大作中提到】
: 不过会crash
avatar
d*2
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.
avatar
p*o
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.

avatar
s*b
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

avatar
w*g
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;
: }

avatar
d*2
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()
: 不知道这样设计有什么依据

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。