Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 与唯一ptr的混淆_C++_Memory Management_Unique Ptr - Fatal编程技术网

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;}
};