以下是一个示例代码:
class IntWrapper
{
public:
IntWrapper(int value_ = 0): value(value_) {}
int getNumber()
{
return value;
}
void setNumber(int value_)
{
value = value_;
}
private:
int value;
};
class T
{
public:
T(){}
void test()
{
std::cout << ptr->getNumber() << std::endl;
ptr->setNumber(10);
std::cout << ptr->getNumber() << std::endl;
}
private:
IntWrapper *ptr;
};
int main( int argc, char* argv[] )
{
T t;
t.test(); // may cause segmentation fault
return 0;
}
ptr这是一个悬垂的指针。当我运行该程序时,它会打印出来:
1
10
但它也可能导致分段错误(即使只有一个读取内存的函数 - 调用getNumber)。
答案 0 :(得分:2)
由于ptr永远不会被初始化,它可能指向任何东西 - 代码,数据,堆栈,未映射的内存,映射但不在使用范围内的内存。也就是说,ptr成员变量中的地址可以包含随机剩余数据,由编译器或堆实现生成的特殊值,或者???
在大多数情况下,推断在这些情况下你为什么会遇到或不会出现分段错误并不是特别有用或有意义。不要那样做。这是&#34;未定义的行为&#34;并且可能导致任意不可预测的事情发生。