添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在看一些C++的文章的时候,经常会看到关于delete与free的区别,delete不需要检查指针是否为NULL。如下面一篇文章 http://www.cnblogs.com/zhuyp1015/archive/2012/07/20/2601698.html

但是有时候,又会看到由于delete引起的double free or corruption,我们可以写一个很简单的程序,来测试delete会不会引起double free。

#include <iostream>
using namespace std;
#ifndef NULL
#define NULL 0
#endif
class A
public:
        cout << "\tA was constructed" << endl;    
    ~A(){
        cout << "\tA was deconstructed" << endl;    
int main()
    int* a = NULL;
    cout << "befor delete: " << a << endl;    
    delete a;
    cout << "delete once: " << a << endl;    
    delete a;
    cout << "delete twice: " << a << endl;    
    a = new int(3);
    cout << "after new an integer: " << a << endl;    
    delete a;
    cout << "delete once: " << a << endl;    
    delete a;
    cout << "delete twice: " << a << endl;            
    A* b = new A();
    cout << "after new A: " << b << endl;    
    delete b;
    cout << "delete once: " << b << endl;    
    delete b;
    cout << "delete twice: " << b << endl;        
    int* c = new int[3];
    cout << "after new an array: " << c << endl;    
    delete  [] c;
    cout << "delete once: " << c << endl;    
    delete  [] c;
    cout << "delete once: " << c << endl;    
    return 0;
 

下面是结果,

测试环境,ubuntu10.04,g++4.4.3.

出现double free了。从输出可以看到,如果指针ptr的值不为NULL,那么在第一次delete之后,ptr也不会被置为0,然后进行第二次delete的时候,就出现double free。

上面代码里有一段是创建一个类的实例,在构造函数和析构函数中有输出,测试的时候,在第二次delete的时候,析构函数又执行了一次,然后就出现double free了。

如何避免double free呢?

一种方法就是在delete之后将指针置为NULL。有其它方法吗?检查指针是否为0?这个。。。

转载于:https://www.cnblogs.com/Frandy/archive/2012/10/29/cpp_delete_double_free.html

在看一些C++的文章的时候,经常会看到关于delete与free的区别,delete不需要检查指针是否为NULL。如下面一篇文章http://www.cnblogs.com/zhuyp1015/archive/2012/07/20/2601698.html。但是有时候,又会看到由于delete引起的double free or corruption,我们可以写一个很简单的程序,来测试... 作为经验法则,每次声明一个指针变量时,务必立即用适当的指针或 nullptr 进行初始化! 例如,图 7-1 显示了执行以下代码后的内存状态。这行代码在一个函数内,所以i是一个局部变量: int i = 7; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNWUi2i1-1632236813891)(/home/xz/图片/选区_928.png)] i是在栈上分
之前介绍过利用valgrind来定位内存泄漏(慢性病, 会导致程序在某个不确定的时刻异常), 本文我们来简要介绍利用valgrind来定位内存的重复释放(急性病, 会报纸程序崩溃)。 看程序: #include #include #include int main() char *p = (char *)malloc(30); free(p); free(p);
本文从自己动手构造一个内存泄露分析工具的方面入手,而不对具体内存排查工具的使用进行说明,以展示内存泄露排查的本质,提供一些思路,当在手头没有现成工具可以使用的情况下让自己不至于那么的无助,至少我们还可以自己构建工具解决它。 memory leak & double free 如果分配的多余释放的,在我们的代码中就是调用malloc(calloc、realloc、memalgin、new)的次数
malloc和free是C语言中的动态内存分配和释放函数,用于在程序运行时动态地分配和释放内存空间。malloc函数用于分配一块指定大小的内存空间,free函数用于释放已分配的内存空间。 new和deleteC++语言中的动态内存分配和释放运算符,用于在程序运行时动态地分配和释放内存空间。new运算符用于分配一块指定大小的内存空间,并返回指向该内存空间的指针,delete运算符用于释放已分配的内存空间。 总的来说,malloc和free是C语言中的动态内存分配和释放函数,new和deleteC++语言中的动态内存分配和释放运算符。它们的使用方法和功能类似,但是在C++中,new和delete还可以用于对象的构造和析构。