c++ - 对象超出范围后,引用成员设置为 0

标签 c++ c++11

<分区>

让我们考虑以下引用已销毁对象的示例。

struct Config
{
    unsigned int m_maxSize = 1;
};

class FileReader
{
public:
    FileReader(Config& config) : m_cfg(config){
    }

    Config& m_cfg;
};

class FileReaderUser
{
    FileReader* m_fileReader;
public:
    FileReaderUser(){
        Config cfg;
        cfg.m_maxSize = 1234;
        m_fileReader = new FileReader(cfg);
    }

    void PrintSize(){
        std::cout << "Config value: " << m_fileReader->m_cfg.m_maxSize << std::endl;
    }
};

int main()
{
    FileReaderUser fileReaderUser;
    fileReaderUser.PrintSize();
}

在此示例中输出为 0。我的问题是为什么它为零?如果内存已被其他对象占用(不确定是否为真),或者未触及旧 (1234) 值,我预计会发生访问冲突。它是在调试中的 GCC 7.2.0 上编译的。

最佳答案

My question is why is it zero?

因为程序的行为是未定义的。这是程序可能具有的一种可能行为。

I would expect to

期望任何特定行为是愚蠢的。您的任何期望都不能保证是正确的。

expect to have access violation if memory was already taken by some other object

操作系统检测到内存访问冲突。操作系统不知道 C++ 程序使用的“对象”,因此操作系统不知道某一 block 内存是否被一个对象或另一个对象使用。当您尝试访问具有无效映射的内存页面时,您会遇到访问冲突。

更一般地说,如果您访问超出其生命周期的对象,该语言不保证您会遇到内存访问冲突。事实上,我不认为在任何情况下 C++ 语言会有这样的保证。

or to have untouched old (1234) value

当您访问超出其生命周期的对象时,无法保证您会获得未触及的值。没有任何保证。

关于c++ - 对象超出范围后,引用成员设置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57996806/

相关文章:

c++ - boost 变体 istringstream 和流错误

c++ - boost::iostreams::bzip2_compressor 仅在使用 c++0x 时失败

c++ - 如何修复我的代码中的无限循环?我认为它跳过了第二个 cin 所以它一直在循环

c++ - 两个经过修饰的名称分解为相同的函数签名

c++ - 模板化成员函数和参数转发

c++ - 在C++运行时创建多个不确定数量的链表

c++ - 为什么这个 Ruby 代码比等效的 C++ 代码快得多?

c++ - 如何正确地转换数据开始指针(这甚至是一种好习惯)?

c++ - 如何将 `std::chrono::milliseconds` 转换为 `boost::posix_time::milliseconds`

C++ map 位置