能否在构造函数的function-try处理程序中访问this指针?
构造函数函数try块中
this指针的访问问题 先看你的代码示例:
class C { C() try { void* addr = this; add_addr_to_static_structure(addr); // May throw exception } catch(...) { void* addr = this; // <- Can I access this ? remove_addr_from_static_structure(addr); } };
结论
你可以安全地将this作为单纯的指针值使用(不解引用的前提下),不会触发未定义行为。
详细解释
- 构造函数的函数try块触发catch时,对象的非静态成员和基类子对象确实已经被销毁,这也是标准禁止在此场景下访问成员/基类的原因——这类操作属于解引用
this的行为,会导致未定义行为。 - 但
this指针本身的地址值是有效的:它指向的是原本为该对象分配的内存地址,即使构造失败,这个地址的标识作用依然存在。你之前用这个地址注册到静态结构中,现在用同一个地址值来注销,逻辑上完全成立,且符合标准规定。 - 简单来说:只要你不通过
this去访问对象的成员、调用非静态成员函数,仅仅把this转成void*(或其他指针类型)传递、作为标识值使用,就是合法的操作。
内容的提问来源于stack exchange,提问作者mgautierfr
相关产品推荐
相关产品推荐

