在看一些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和delete是C++语言中的动态内存分配和释放运算符,用于在程序运行时动态地分配和释放内存空间。new运算符用于分配一块指定大小的内存空间,并返回指向该内存空间的指针,delete运算符用于释放已分配的内存空间。
总的来说,malloc和free是C语言中的动态内存分配和释放函数,new和delete是C++语言中的动态内存分配和释放运算符。它们的使用方法和功能类似,但是在C++中,new和delete还可以用于对象的构造和析构。