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



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

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上编译的。

我的问题是为什么它是零?

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

我希望

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

如果内存已被其他对象占用,则会出现访问冲突

操作系统检测到内存访问冲突。操作系统不知道C++程序使用的"对象",因此操作系统不知道某个内存是由一个对象还是另一个对象使用。当您尝试访问具有无效映射的内存页时,会出现访问冲突。

更一般地说,该语言不保证在对象的生存期之外访问对象时会出现内存访问冲突。事实上,我认为没有任何情况下C++语言会有这样的保证。

或具有未触及的旧 (1234( 值

无法保证在对象生存期之外访问对象时获得未触及的值。没有任何保证。

最新更新