c++ - 如何工作 - 没有 new 的指针/Unique_ptr

标签 c++ pointers undefined-behavior unique-ptr

foo.h

#include <iostream>
#include <memory>

class Bar
{
public:
    Bar() {};
    ~Bar() {};
    void print() {
        std::cout << "hello";
    }
};

class Foo
{
public:
    Foo(); 
    ~Foo();
    void use() {
        pteste->print();
    }
private:
    std::unique_ptr<Bar> pteste;
};

#endif

ma​​in.cpp

#include <memory>
#include "foo.h"

int main(int argc, char *argv[]) 
{
    Foo s;
    s.use();

    return 0;
}

为什么以及如何“正常”工作?

谢谢

编辑:我了解不完整的类型,但是当我可以使用 unique_ptr 而不使用 new 时会发生什么以及为什么有效

EDIT2:针对我的问题更好地组织代码

最佳答案

简短回答:这不起作用。

这个reference表示 std::unique_ptr 的默认构造函数创建一个空的唯一指针,这意味着它没有关联的对象。

这段代码之所以打印hello是因为这条语句

std::cout << "hello";

不需要任何Bar。它也可以是静态方法。也许编译器内联该函数并用 std::cout 语句替换 s.use() 。但即使它确实调用了该方法,您也不会注意到任何错误,因为它根本不访问 Bar 的内存。

对你的类稍作改变,你就会明白我的意思:

class Bar
{
public:
    Bar() : data(10) {};
    ~Bar() {};
    void print() {
        std::cout << "hello, data is: " << data;
    }

    int data;
};

现在,print 访问无效内存,因为您从未调用new(或者更好:make_unique)。它甚至可以工作并向控制台打印一些内容,但 data 的输出将是垃圾。如果幸运的话,应用程序将会崩溃。

它似乎有效的另一个原因(感谢 Stas):

std::unique_ptr 定义了 operator->,它只是返回所包含的指针,但不检查指针是否指向有效内存。所以 pteste-> 不会抛出异常。

关于c++ - 如何工作 - 没有 new 的指针/Unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22217387/

相关文章:

optimization - 在 Copy 类型中使用 std::ptr::write_volatile 实现内部可变性的安全性(即没有 UnsafeCell)

c++ - 我们是否有时必须根据 C++ 标准编写具有未定义行为的代码?

c++ - 使用 FFmpeg 在 mp4 容器中寻找 h264 编解码器的视频帧。数据包点数始终为0

c++ - C++ 流是如何工作的?

java - 如何随机调用方法(Java JDK11)?

c++ - 什么时候在空实例上调用成员函数会导致 C++11 中的未定义行为?

c++ - 指向对象类型的指针

C++ 字符串\vector 初始化

c - Arduino 定时器库和 void 指针

c++ - 遇到无效写入问题