【发布时间】:2018-12-20 02:59:53
【问题描述】:
在下面的代码中,我在作用域中创建了一个shared_ptr 并将其分配给weak_ptr。怎么在运行代码的时候没有得到SEGFAULT,因为wp应该是无效的超出范围吧?
namespace {
struct Dummy {
int x;
void foo() {
std::cout << "dummy created\n";
}
~Dummy()
{
std::cout << "dummy destroyed\n";
}
};
}
TEST(experimental, ptr_test){
std::weak_ptr<Dummy> wp;
{
auto sp = std::make_shared<Dummy>();
wp = sp;
}
wp.lock()->foo();
};
【问题讨论】:
-
C++ 不保证无效代码会出现段错误。
-
取消引用 NULL 指针是 UB。由于
foo的定义根本没有使用this,所以编译器会忽略它。