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 指向的值时,会得到一个垃圾值,表示内存已被释放。

输出结果:

1.png

接下来,我们来看一个使用 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 分配了一个只能容纳单个浮点类型值的内存块。

输出结果:

2.png

再来看另一个示例。

#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 函数分配。

输出结果:

3.png

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 所指向的内存块。

输出结果:

4.png

让我们看看如何在对象数组中使用 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;  
}

输出结果:

5.png

delete 和 free() 的区别

delete 和 free() 在 C++ 中的区别如下:

  • delete 是一个动态释放内存的运算符,而 free() 是一个在运行时销毁内存的函数。
  • delete 运算符用于删除指针,该指针可以是使用 new 运算符分配的指针或空指针,而 free() 函数用于删除使用 malloc()、calloc() 或 realloc() 函数分配的指针或空指针。
  • 当 delete 运算符销毁已分配的内存时,它会调用 C++ 类的析构函数,而 free() 函数不会调用析构函数,它只会释放堆中的内存。
  • delete() 运算符比 free() 函数快。

标签: C++语言, C++语言教程, C++语言技术, C++语言学习, C++语言学习教程, C++语言下载, C++语言开发, C++语言入门教程, C++语言进阶教程, C++语言高级教程, C++语言面试题, C++语言笔试题, C++语言编程思想