先看一段会造成死机的代码及其运行结果:
#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。
转载于:https://blog.51cto.com/frankniefaquan/1936961