首页 > 代码库 > 调试死机问题时可根据死机地址快速判断问题出在栈区还是堆区
调试死机问题时可根据死机地址快速判断问题出在栈区还是堆区
先看一段会造成死机的代码及其运行结果:
#include <iostream> using std::cout; using std::endl; using std::ostream; class Tree { int height; public: Tree(int treeHeight) : height(treeHeight) { cout << __func__ << "(), this = " << this << endl; } ~Tree() { cout << "~Tree()\n"; } #if 0 friend ostream& operator<<(ostream& os, const Tree* t) { return os << "Tree height is: " << t->height << endl; } #else friend ostream& operator<<(ostream& os, const Tree& t) { return os << "Tree height is: " << t.height << endl; } #endif }; int main() { cout << "create an object address in stack\n"; Tree obj(10); cout << "create an object address in heap\n"; Tree* t = new Tree(40); delete t; //t = nullptr; delete t; }
运行结果:
frank@userver:~/project/test/cpp/new_del$ ./a.out
create an object address in stack
Tree(), this = 0x7fffdbe5b850
create an object address in heap
Tree(), this = 0x18ab010
~Tree()
~Tree()
*** Error in `./a.out‘: double free or corruption (fasttop): 0x00000000018ab010 ***
Aborted (core dumped)
分析:栈空间的对象地址为0x7fffdbe5b850。堆空间的对象地址为0x18ab010。测试环境为64位虚拟机。栈地址的高4字节地址不为0,堆地址的高4字节通常为0。
本文出自 “用C++写诗” 博客,谢绝转载!
调试死机问题时可根据死机地址快速判断问题出在栈区还是堆区
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。