C++ free vs delete 释放与删除

在本主题中,我们将学习C++ 中的free()函数和删除运算符。

免费()功能

free() 函数在 C++ 中用于动态释放内存。它基本上是 C++ 中使用的一个库函数,它在stdlib.h头文件中定义当指针指向使用 malloc() 函数分配的内存或 Null 指针时,将使用此库函数。

free() 函数的语法

假设我们已经声明了一个指针“ptr”,现在我们想要取消分配它的内存:

句法 (Syntax)

free(ptr);

上述语法将取消分配指针变量“ptr”的内存。


free() 参数

在上面的语法中,ptr 是 free() 函数中的一个参数。ptr 是指向使用 malloc()、calloc() 或 realloc 函数分配的内存块的指针。该指针也可以为空或使用 malloc 分配但不指向任何其他内存块的指针。

  • 如果指针为空,则 free() 函数将不会执行任何操作。

  • 如果使用 malloc、calloc 或 realloc 分配指针,但未指向任何内存块,则此函数将导致未定义的行为。

free() 返回值

free() 函数不返回任何值。它的主要功能是释放内存。

让我们通过一个例子来理解。

例子 (Example)

#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 指向的值时,我们得到一个垃圾值,这意味着内存被释放。

输出

在 C++ 中释放与删除

让我们看看 free() 函数如何与 calloc 一起工作。

例子 (Example)

#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 类型的值。

输出:


在 C++ 中释放与删除

让我们看另一个例子。

例子 (Example)

#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++ 中释放与删除

删除运算符

它是C++ 编程语言中使用的运算符,用于动态释放内存。该运算符主要用于那些使用新运算符或 NULL 指针分配的指针。

句法 (Syntax)

delete pointer_name

例如,如果我们使用 new 运算符将内存分配给指针,现在我们要删除它。要删除指针,我们使用以下语句:

例子 (Example)

delete p;

要删除数组,我们使用下面给出的语句:

例子 (Example)

delete [] p;

与删除运算符相关的一些要点是:

  • 它用于删除使用 new 关键字分配的数组或非数组对象。

  • 要删除数组或非数组对象,我们分别使用 delete[] 和 delete 运算符。

  • new 关键字在堆中分配内存;因此,我们可以说 delete 运算符总是从堆中取消分配内存

  • 它不会销毁指针,但会销毁指针指向的值或内存块。

让我们看一下删除运算符的简单示例。

例子 (Example)

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

输出

在 C++ 中释放与删除

让我们看看 delete 如何处理对象数组。

例子 (Example)

#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() 的区别

以下是C++中delete和free()的区别:

  • delete 是一个动态取消分配内存的运算符,而 free() 是一个在运行时销毁内存的函数。

  • delete 运算符用于删除使用 new 运算符或 NULL 指针分配的指针,而 free() 函数用于删除使用 malloc()、calloc() 或 realloc() 分配的指针函数或 NULL 指针。

  • 当 delete 运算符销毁分配的内存时,它会调用 C++ 中类的析构函数,而 free() 函数不会调用析构函数;它只会从堆中释放内存。

  • delete() 运算符比 free() 函数更快。


上一主题 C++ malloc() vs new in 下一主题 没有了
  • 使用社交账号登录,本站支持
全部评论(0)