【发布时间】:2020-08-28 22:50:35
【问题描述】:
对不起,愚蠢的标题,想不出它应该是怎样的。 我在玩 unique_ptr,创建了指向 unique_ptr 的指针(我知道我不应该创建指向 unique_ptr 的指针,我只是想看看发生了什么)
class A
{
public:
A() {std::cout<<"A const\n";}
~A() {std::cout<<"~A dest\n";}
void fun() {std::cout<<"A fun\n";}
};
int main()
{
std::unique_ptr<A>* u1 = new std::unique_ptr<A>(new A);
u1[1000]->fun();
delete u1;
return 0;
}
我预计输出会崩溃,但它就像我使用 u1[0] 时一样工作。我完全不知道为什么,我完全希望它崩溃。
A const
A fun
~A dest
这段代码是怎么执行的? 它适用于 g++,也适用于在线 c++ shell http://cpp.sh/
【问题讨论】:
-
你知道什么是未定义行为,但你不知道为什么你的代码成功了?
-
调用 fun() 不会访问任何特定 A 实例中的任何内容(使用这些编译器构建时,在此平台上)。向 A 添加一个成员,让 fun() 打印它,看着它崩溃。或者将 fun() 声明为虚拟的,然后看着它崩溃。
-
或者干脆知道是UB,别想了。识别 UB 的那一刻,任何逻辑分析都是毫无意义的。
-
未定义行为的行为未定义。它是没有限制的,在无限的可能性中,它总是看起来像它有效,而不是看起来像它永远不会有效。 UB 赢不了。
标签: c++ arrays c++11 pointers unique-ptr