C++教程-C++free() vs delete ()
C++ free() vs delete()
在这个主题中,我们将学习 C++ 中的 free() 函数和 delete 运算符。
free() 函数
在 C++ 中,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 integers" << endl;
for (int i=0; i<5; i++)
{
// *(ptr+i) can be replaced by ptr[i]
cin >>ptr[i];
}
cout << endl << "User entered values" << endl;
for (int i=0; i<5; i++)
{
cout <<*(ptr+i) << " ";
}
free(ptr);
/* prints a garbage value after ptr is freed */
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 的示例。
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
float *ptr; // 浮点型指针声明
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() 函数为浮点型指针 ptr 分配了内存块。我们为 ptr 分配了一个只能容纳单个浮点类型值的内存块。
输出结果:
再来看另一个示例。
#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); // 如果执行这条语句,会出现运行时错误。
return 0;
}
上述代码展示了 free() 函数在空指针中的工作方式。我们声明了两个指针,ptr1 和 ptr2。我们给指针 ptr1 分配了一个 NULL 值,将 x 变量的地址赋给指针 ptr2。当我们对 ptr1 应用 free(ptr1) 函数时,分配给 ptr 的内存块被成功释放。free(ptr2) 语句会导致运行时错误,因为 ptr2 所指向的内存块没有使用 malloc 或 calloc 函数分配。
输出结果:
Delete 运算符
Delete 运算符是在 C++ 编程语言中使用的运算符,用于动态释放内存。它主要用于删除使用 new 运算符分配的指针或空指针。
语法
delete pointer_name
例如,如果我们使用 new 运算符为指针分配了内存,并且现在我们想要删除它。为了删除指针,我们使用以下语句:
delete p;
为了删除数组,我们使用以下语句:
delete [] p;
与 delete 运算符相关的一些重要点:
- 它用于删除使用 new 关键字分配的数组或非数组对象。
- 为了删除数组或非数组对象,我们分别使用 delete[] 和 delete 运算符。
- new 关键字在堆中分配内存,因此可以说 delete 运算符总是从堆中释放内存。 它不会销毁指针,而是销毁指针所指向的值或内存块。
让我们来看一个 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 所指向的内存块。
输出结果:
让我们看看如何在对象数组中使用 delete 运算符。
#include <iostream>
using namespace std;
int main()
{
int *ptr=new int[5]; // 使用 new 运算符分配内存。
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; // 删除指针所指向的内存块。
std::cout << "delete 后的垃圾值:" << std::endl;
for(int i=1;i<=5;i++)
{
cout<<*(ptr+i)<<endl;
}
return 0;
}
输出结果:
delete 和 free() 的区别
delete 和 free() 在 C++ 中的区别如下:
- delete 是一个动态释放内存的运算符,而 free() 是一个在运行时销毁内存的函数。
- delete 运算符用于删除指针,该指针可以是使用 new 运算符分配的指针或空指针,而 free() 函数用于删除使用 malloc()、calloc() 或 realloc() 函数分配的指针或空指针。
- 当 delete 运算符销毁已分配的内存时,它会调用 C++ 类的析构函数,而 free() 函数不会调用析构函数,它只会释放堆中的内存。
- delete() 运算符比 free() 函数快。