在try/catch外部声明但在内部初始化的指针会导致未定义的行为
Pointer declared outside of try/catch but initialized inside causes undefined behaviour?
我有一个代码,看起来像下面的:
class ClassA
{
public:
ClassA(string p1, string p2);
void DoSomething();
};
int main()
{
ClassA *p = NULL;
try
{
// ...
// some external input that can throw
// ...
ClassA a{"some", "params"};
p = &a;
}
catch(...)
{
// print error
}
if (p != NULL) {
p->DoSomething(); // <- causes segfault
}
}
道歉,如果这是坏/愚蠢的代码(我是新的c++),但为什么调用a->DoSomething()
导致段错误发生?显然,p
被声明在try/catch块的范围之外,p != NULL
总是返回true,表明p
不为空,因此在try/catch块内部被正确初始化。
指针初始化为指向自动内部作用域中对象的实例。
当执行线程离开作用域时,对象被销毁,指针现在指向被销毁的对象。
抛出的异常当然会离开声明对象的作用域。
换句话说,指针指向的对象只存在于try
块中,一旦执行离开try
块,自然地,或者通过抛出异常,对象将被销毁。
异常被catch
块捕获的事实是不相关的。
这是使用智能指针的另一个原因。如果对象是在动态范围内分配的,并且所讨论的指针是unique_ptr
或shared_ptr
,则通过智能指针在catch
块中仍然可以完全访问该对象,而不需要额外的工作。
指针p
指向局部对象a
,该对象的生存期仅限于try
块。在那个块的外面有一个悬浮指针。因此,导致段错误的未定义行为。
相关文章:
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 在硬件SIMD矢量指针和相应类型之间进行"interpret_cast"是一种未定义的行为吗
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- C++:私有类指针成员返回未定义的值
- 返回对未定义指针的引用
- 使用无效指针初始化指针声明符的行为是否未定义?
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 强制转换为指针引用是否会导致未定义的行为
- C++编译并链接到指向未定义函数的指针
- C++数组上的指针数学中的未定义行为
- 通过在此指针上放置新位置重新初始化对象时未定义的行为
- C 指针未定义的参考
- 将未定义的参数计数作为模板参数的函数指针
- 指针上的const_cast "this"是未定义的行为吗?
- 为什么指针减法是C++中未定义的行为?
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 为什么将指针指向std ::设置的提取节点是未定义的行为
- 使用已删除shared_ptr中的原始指针的未定义行为
- c++ typedef静态函数指针:未定义符号
- 正在打印空指针未定义的行为