C++ 为什么不在我的c++;密码
g++版本是C++ 为什么不在我的c++;密码,c++,double-free,C++,Double Free,g++版本是g++(GCC)4.1.220080704(Red Hat 4.1.2-50) 我的测试代码如下 #include <iostream> using namespace std; class Handle{ public: Handle(int *p, int u):_p(p),use(u){} ~Handle(){cout << "delete" << endl;
g++(GCC)4.1.220080704(Red Hat 4.1.2-50)
我的测试代码如下
#include <iostream>
using namespace std;
class Handle{
public:
Handle(int *p, int u):_p(p),use(u){}
~Handle(){cout << "delete" << endl; delete _p;}
void display(){cout << "value : " << *_p << ", use : " << use << endl;}
private:
int *_p;
int use;
};
int main()
{
//Test case one
{
int *i = new int(10);
Handle *h = new Handle(i, 2);
Handle *h1 = new Handle(i, 100);
h->display();
h1->display();
delete h;
delete h1;
//call ~Handle() two times, means free double times, why don't runtime error??
}
//Test case two
{
int *a = new int(11);
Handle h2(a, 23);
Handle h3(a, 33);
h2.display();
h3.display();
//in this case, will double free error
}
cout << "ok" << endl;
return 0;
}
#包括
使用名称空间std;
类句柄{
公众:
句柄(int*p,intu):_p(p),使用(u){
~Handle(){cout我不知道为什么您的一个测试会导致问题,而另一个不会。两者都是错误的。Handle
如果没有分配指针,就不应该释放指针。这只是自找麻烦。我不知道为什么您的一个测试会导致问题,而另一个不会。两者都是错误的。Handle
不应该如果指针没有分配指针,则重新生成指针。这只是自找麻烦。句柄的析构函数被调用两次。它在\u p上调用delete。在这两种情况下,p都指向a的单个实例。Double free a。句柄的析构函数被调用两次。它在\u p上调用delete。在这两种情况下,p都指向singa.Double的le实例没有a.额外测试出现问题的可能原因是它有一个新的内存分配
许多malloc/free new/delete库在双重释放期间会损坏其数据结构。在下次分配或释放操作之前,可能不会注意到这种损坏。这将是您的测试二
有些库甚至可以无误运行。我相信,某些版本的Windows实现了一个相当缓慢但健壮的内存堆处理程序,作为一个兼容性选项,以便不会使有bug但运气好的旧软件崩溃。您只会在额外测试中遇到问题的可能原因是,它有一个新的内存分配它
许多malloc/free new/delete库在双重释放期间会损坏其数据结构。在下次分配或释放操作之前,可能不会注意到这种损坏。这将是您的测试二
有些库甚至可以无误运行。我相信某些版本的Windows实现了一个相当缓慢但健壮的内存堆处理程序作为一个兼容性选项,以避免使有bug但幸运的旧软件崩溃。您说~Handle
被调用了三次,但只会被调用两次。也许您应该包括取消输出。您说,~Handle
被调用了三次,但只会被调用两次。也许您应该包括输出。