指针摆动和分段错误

Dangling pointer and segmentation fault

本文关键字:分段 错误 指针      更新时间:2023-10-16

下面是一个示例代码:

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)。

  1. 当ptr指向的内存位置没有被其他对象(程序)分配时,不存在分割错误,对吗?如何解释

由于ptr从未初始化,它可能指向任何东西——代码、数据、堆栈、未映射的内存、已映射但不在使用范围内的内存。也就是说,ptr成员变量中的地址可能包含随机剩余数据、编译器或堆实现生成的特殊值,或者???

在大多数情况下,推理为什么在这些情况下出现或没有出现分段错误并不是特别有用或有意义。只是不要那样做。这是"未定义的行为",可以导致任意不可预测的事情发生。