在本主题中,我们将学习C++ 中的free()函数和删除运算符。
free() 函数在 C++ 中用于动态释放内存。它基本上是 C++ 中使用的一个库函数,它在stdlib.h头文件中定义。当指针指向使用 malloc() 函数分配的内存或 Null 指针时,将使用此库函数。
假设我们已经声明了一个指针“ptr”,现在我们想要取消分配它的内存:
free(ptr);
上述语法将取消分配指针变量“ptr”的内存。
在上面的语法中,ptr 是 free() 函数中的一个参数。ptr 是指向使用 malloc()、calloc() 或 realloc 函数分配的内存块的指针。该指针也可以为空或使用 malloc 分配但不指向任何其他内存块的指针。
如果指针为空,则 free() 函数将不会执行任何操作。
如果使用 malloc、calloc 或 realloc 分配指针,但未指向任何内存块,则此函数将导致未定义的行为。
free() 函数不返回任何值。它的主要功能是释放内存。
让我们通过一个例子来理解。
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int *ptr;
ptr = (int*) malloc(5*sizeof(int));
cout << "请输入5个整数" << endl;
for (int i=0; i<5; i++)
{
// *(ptr+i) 可以替换为 ptr[i]
cin >>ptr[i];
}
cout << endl << "用户输入的值"<< endl;
for (int i=0; i<5; i++)
{
cout <<*(ptr+i) << " ";
}
free(ptr);
/* 在 ptr 空闲后打印一个垃圾值 */
cout << "垃圾值" << endl;
for (int i=0; i<5; i++)
{
cout << *(ptr+i)<< " ";
}
return 0;
}上面的代码显示了 free() 函数如何与 malloc() 一起工作。首先,我们声明整型指针*ptr,然后使用malloc()函数为这个指针变量分配内存。现在,ptr 指向 5 个整数的未初始化内存块。分配内存后,我们使用 free() 函数销毁分配的内存。当我们尝试打印 ptr 指向的值时,我们得到一个垃圾值,这意味着内存被释放。
输出

让我们看看 free() 函数如何与 calloc 一起工作。
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
float *ptr; // 浮点指针声明
ptr=(float*)calloc(1,sizeof(float));
*ptr=6.7;
std::cout << "应用 free() 函数之前 *ptr 的值: " <<*ptr<< std::endl;
free(ptr);
std::cout << "应用 free() 函数后 *ptr 的值:" <<*ptr<< std::endl;
return 0;
}在上面的例子中,我们可以观察到 free() 函数与 calloc() 一起工作。我们使用 calloc() 函数将内存块分配给浮点指针 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 << "指针不为空" << std::endl;
}
else
{
cout<<"Ponter 为 NULL";
}
free(ptr1);
//free(ptr2); // 如果执行此语句,则会给出运行时错误。
return 0;
}上面的代码显示了 free() 函数如何使用 NULL 指针。我们声明了两个指针,即 ptr1 和 ptr2。我们为指针 ptr1 分配一个 NULL 值,为指针 ptr2 分配 x 变量的地址。当我们对 ptr1 应用 free(ptr1) 函数时,分配给 ptr 的内存块就被成功释放了。语句 free(ptr2) 显示运行时错误,因为分配给 ptr2 的内存块不是使用 malloc 或 calloc 函数分配的。
输出

它是C++ 编程语言中使用的运算符,用于动态释放内存。该运算符主要用于那些使用新运算符或 NULL 指针分配的指针。
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 << "p 的值为:" <<*ptr<< std::endl;
delete ptr;
std::cout <<"删除后的值为:" <<*ptr<< std::endl;
return 0;
}在上面的代码中,我们使用new运算符来分配内存,所以我们使用delete ptr运算符来销毁指针ptr指向的内存块。
输出

让我们看看 delete 如何处理对象数组。
#include <iostream>
using namespace std;
int main()
{
int *ptr=new int[5]; // 使用新运算符分配内存。
std::cout << "请输入 5 个整数:" << std::endl;
for(int i=1;i<=5;i++)
{
cin>>ptr[i];
}
std::cout << "输入的值是:" << std::endl;
for(int i=1;i<=5;i++)
{
cout<<*(ptr+i)<<endl;
}
delete[] ptr; //删除ptr指向的内存块。
std::cout << "删除后,垃圾值:" << std::endl;
for(int i=1;i<=5;i++)
{
cout<<*(ptr+i)<<endl;
}
return 0;
}输出

以下是C++中delete和free()的区别:
delete 是一个动态取消分配内存的运算符,而 free() 是一个在运行时销毁内存的函数。
delete 运算符用于删除使用 new 运算符或 NULL 指针分配的指针,而 free() 函数用于删除使用 malloc()、calloc() 或 realloc() 分配的指针函数或 NULL 指针。
当 delete 运算符销毁分配的内存时,它会调用 C++ 中类的析构函数,而 free() 函数不会调用析构函数;它只会从堆中释放内存。
delete() 运算符比 free() 函数更快。