C++ 与唯一ptr的混淆
我预计以下代码在运行时会因空指针错误而崩溃:C++ 与唯一ptr的混淆,c++,memory-management,unique-ptr,C++,Memory Management,Unique Ptr,我预计以下代码在运行时会因空指针错误而崩溃: #include <memory> #include <iostream> #include <cassert> struct Foo { void echo() {std::cout << "Echo" << std::endl;} }; int main() { std::unique_ptr<Foo> up(new Foo()); up.rese
#include <memory>
#include <iostream>
#include <cassert>
struct Foo {
void echo() {std::cout << "Echo" << std::endl;}
};
int main()
{
std::unique_ptr<Foo> up(new Foo());
up.reset(nullptr);
assert(up.get() == nullptr);
up.get()->echo();
}
而且assert没有启动,所以get()是
nullptr
您实际上是在用无效的对象参数调用成员函数,这通常被认为会触发未定义的行为。但是,您没有在成员函数中使用此
,因此实际上不应发生分段故障
尝试添加一个成员并在echo
中访问该成员。那会使你的程序崩溃。即
struct Foo
{
int i;
void echo() {std::cout << i << std::endl;}
};
structfoo
{
int i;
void echo(){std::cout通过空指针调用成员函数肯定是一种未定义的行为
您对该成员函数的调用是成功的,因为您没有使用此指针。UB是UB,您不应该期望任何东西。我如何调用nullptr上的方法?终于再次找到了副本。@重复数据消除或做得很好:)顺便说一句:unique\u ptr
是您问题中的一个红色标记。错误在前面,请参阅副本。Columbo,“谢谢!”DePoprter:什么意思?取消空指针。DYP说,否则我以前也用过同样的论证。@ Dyp:在C++中取消空指针是好的吗?在哪里,他的论点是什么?我希望它不是“看起来有用”。。因为我对任何允许取消引用空指针的东西都非常感兴趣,特别是因为它打破了引用始终表示对象的保证。取消引用空指针会产生一个左值。没有创建引用本身。我会在我们讨论的地方找到注释。
struct Foo
{
int i;
void echo() {std::cout << i << std::endl;}
};