0

每当我将特定的指针地址输出到 时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未标记为内联。

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

4

2 回答 2

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`
于 2012-05-10T17:49:57.113 回答
3

可能有 , 的重载operator<<(ostream &, MyClassPrivate*)会取消对指针的引用。例如当然有 if MyClassPrivateis true char

试试看std::cout << (void*)d;,看看有没有区别。如果不是,zneak 的回答似乎是合理的。

于 2012-05-10T17:50:44.757 回答