什么可能导致写入指针地址std :: cout崩溃?

时间:2012-05-10 17:47:58

标签: c++ pointers cout

每当我将特定指针地址输出到std::cout时,我都会崩溃:

bool MyClass::foo() const
{
  std::cout << "this prints fine" << std::endl << std::flush;
  std::cout << d << std::endl << std::flush;  // crash!
  return true;
}

其中d是该类的指针成员,即:

class MyClass {
// ... 
 private:
  MyClassPrivate* d;
};

什么可能导致应用程序崩溃?即使它是一个NULL指针或一个初始化指针,它仍然应该打印出(可能是无效的)地址,对吗?

应用程序在调试模式下编译,如果这有所不同。函数foo未标记为内联。

背景:我正在尝试追踪外部应用程序流程中的错误。该错误仅在另一个应用程序向进程发送rapid-fire命令时引起。我正在使用std::cout来跟踪外部进程的执行情况。

2 个答案:

答案 0 :(得分:4)

如果this不是有效指针,则对成员字段的任何访问都可能导致访问冲突。调用无效指针的非虚方法在尝试访问字段之前工作正常,因为调用本身不需要取消引用this

例如,这种情况会像你描述的那样大致崩溃:

MyClass* instance = nullptr; // or NULL if you're not using C++11
instance->foo(); // will crash when `foo` tries to access `this->d`

答案 1 :(得分:3)

可能存在operator<<(ostream &, MyClassPrivate*)的重载,它会取消引用指针。例如,肯定是MyClassPrivate确实是char

尝试std::cout << (void*)d;,看看它是否有所作为。如果没有,zneak的回答似乎有道理。