在本主题中,我们将学习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() 函数更快。