C++ free和delete的区别
在这个主题中,我们将学习C++中的free()函数和delete操作符。
free()函数
free()函数用于释放动态分配的内存。它是C++中的一个库函数,在stdlib.h头文件中定义。这个库函数用于指针指向使用malloc()函数分配的内存或空指针的情况。
free()函数的语法
假设我们声明了一个指针’ptr’,现在我们想释放它所占用的内存:
free(ptr);
以上的语法将释放指针变量’ptr’的内存。
free()参数
在上述的语法中,ptr是free()函数内的一个参数。ptr是一个指向使用malloc()、calloc()或realloc函数分配的内存块的指针。这个指针也可以是空的,或者是使用malloc分配的指针,但不指向任何其他内存块。
- 如果指针是空的,那么free()函数将不会执行任何操作。
- 如果指针是使用malloc、calloc或realloc分配的,但不指向任何内存块,则该函数将导致未定义的行为。
free()返回值
free()函数不返回任何值。它的主要功能是释放内存。
让我们通过一个例子来理解。
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int *ptr;
ptr = (int*) malloc(5*sizeof(int));
cout << "Enter 5 integer" << endl;
for (int i=0; i<5; i++)
{
// *(ptr+i) can be replaced by ptr[i]
cin >>ptr[i];
}
cout << endl << "User entered value"<< endl;
for (int i=0; i<5; i++)
{
cout <<*(ptr+i) << " ";
}
free(ptr);
/* prints a garbage value after ptr is free */
cout << "Garbage Value" << endl;
for (int i=0; i<5; i++)
{
cout << *(ptr+i)<< " ";
}
return 0;
}
以上代码展示了free()函数与malloc()函数的工作原理。首先,我们声明了整数指针*ptr,然后使用malloc()函数为此指针变量分配内存。现在,ptr指向未初始化的5个整数的内存块。在分配内存后,我们使用free()函数来销毁这个分配的内存。当我们尝试打印由ptr指向的值时,我们得到一个垃圾值,这意味着内存已经被释放。
输出
让我们看看 calloc() 函数如何与 free() 函数一起工作。
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
float *ptr; // float pointer declaration
ptr=(float*)calloc(1,sizeof(float));
*ptr=6.7;
std::cout << "The value of *ptr before applying the free() function : " <<*ptr<< std::endl;
free(ptr);
std::cout << "The value of *ptr after applying the free() function :" <<*ptr<< std::endl;
return 0;
}
在上面的例子中,我们可以观察到free()函数与calloc()函数一起工作。我们使用calloc()函数为float指针ptr分配内存块。我们给ptr分配了一个内存块,可以存储单个float类型的值。
输出:
让我们来看另一个例子。
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int *ptr1=NULL;
int *ptr2;
int x=9;
ptr2=&x
if(ptr1)
{
std::cout << "Pointer is not Null" << std::endl;
}
else
{
cout<<"Ponter is NULL";
}
free(ptr1);
//free(ptr2); // If this statement is executed, then it gives a runtime error.
return 0;
}
以上代码展示了free()函数如何与空指针一起使用。我们声明了两个指针:ptr1和ptr2。将NULL值赋给指针ptr1,将x变量的地址赋给指针ptr2。当我们对ptr1应用free(ptr1)函数时,指向的内存块成功释放。语句free(ptr2)显示运行时错误,因为指向ptr2的内存块未使用malloc或calloc函数进行分配。
输出
删除运算符
它是C++编程语言中使用的一种运算符,用于动态释放内存。该运算符主要用于使用new运算符分配的指针或空指针。
语法
delete pointer_name
通过new运算符为指针分配内存,现在我们想要删除它。要删除指针,我们使用以下语句:
delete p;
要删除数组,我们使用以下语句:
delete [] p;
与删除运算符相关的一些重要要点如下:
- 它用于删除使用new关键字分配的数组或非数组对象。
- 要删除数组或非数组对象,我们分别使用delete[]和delete运算符。
- new关键字在堆中分配了内存;因此,我们可以说delete运算符总是从堆中释放内存。
- 它不会销毁指针,而是销毁指针指向的值或内存块。
让我们看一个删除运算符的简单示例。
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int *ptr;
ptr=new int;
*ptr=68;
std::cout << "The value of p is : " <<*ptr<< std::endl;
delete ptr;
std::cout <<"The value after delete is : " <<*ptr<< std::endl;
return 0;
}
在上述代码中,我们使用new运算符来分配内存,因此我们使用delete ptr运算符来销毁指针ptr所指向的内存块。
输出
看看如何使用对象数组来删除。
#include <iostream>
using namespace std;
int main()
{
int *ptr=new int[5]; // memory allocation using new operator.
std::cout << "Enter 5 integers:" << std::endl;
for(int i=1;i<=5;i++)
{
cin>>ptr[i];
}
std::cout << "Entered values are:" << std::endl;
for(int i=1;i<=5;i++)
{
cout<<*(ptr+i)<<endl;
}
delete[] ptr; // deleting the memory block pointed by the ptr.
std::cout << "After delete, the garbage value:" << std::endl;
for(int i=1;i<=5;i++)
{
cout<<*(ptr+i)<<endl;
}
return 0;
}
输出
delete和free()之间的差异
以下是C++中delete和free()之间的区别:
- delete是一个运算符,用于动态释放内存,而free()是一个在运行时销毁内存的函数。
- delete运算符用于删除指针,该指针是使用new运算符或NULL指针分配的,而free()函数用于删除使用malloc()、calloc()或realloc()函数分配的指针或NULL指针。
- 当delete运算符销毁分配的内存时,它调用C++中的类的析构函数,而free()函数不调用析构函数;它只是从堆中释放内存。
- delete()运算符比free()函数更快。