每当我将特定指针地址输出到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
来跟踪外部进程的执行情况。
答案 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的回答似乎有道理。