-4

这是一个示例代码:

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 指向的内存位置没有被其他对象(程序)分配时,没有分段错误,对吧?怎么解释?
4

1 回答 1

2

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

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

于 2016-04-08T15:26:57.573 回答