C++ free和delete的区别

C++ free和delete的区别

在这个主题中,我们将学习C++中的free()函数和delete操作符。

free()函数

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 integer" << endl;

    for (int i=0; i<5; i++)
    {
    // *(ptr+i) can be replaced by ptr[i]
        cin >>ptr[i];
    }
    cout << endl << "User entered value"<< endl;

    for (int i=0; i<5; i++)
    {
        cout <<*(ptr+i)  << " ";
    }
    free(ptr);

    /* prints a garbage value after ptr is free */
    cout << "Garbage Value" << endl;

    for (int i=0; i<5; i++)
    {
        cout << *(ptr+i)<< " ";
    }
    return 0;
}

以上代码展示了free()函数与malloc()函数的工作原理。首先,我们声明了整数指针*ptr,然后使用malloc()函数为此指针变量分配内存。现在,ptr指向未初始化的5个整数的内存块。在分配内存后,我们使用free()函数来销毁这个分配的内存。当我们尝试打印由ptr指向的值时,我们得到一个垃圾值,这意味着内存已经被释放。

输出

C++ free和delete的区别

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

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
 float *ptr; // float pointer declaration
 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()函数为float指针ptr分配内存块。我们给ptr分配了一个内存块,可以存储单个float类型的值。

输出:

C++ free和delete的区别

让我们来看另一个例子。

#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); // If this statement is executed, then it gives a runtime error.
 return 0;
}

以上代码展示了free()函数如何与空指针一起使用。我们声明了两个指针:ptr1和ptr2。将NULL值赋给指针ptr1,将x变量的地址赋给指针ptr2。当我们对ptr1应用free(ptr1)函数时,指向的内存块成功释放。语句free(ptr2)显示运行时错误,因为指向ptr2的内存块未使用malloc或calloc函数进行分配。

输出

C++ free和delete的区别

删除运算符

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

语法

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

输出

C++ free和delete的区别

看看如何使用对象数组来删除。

#include <iostream>
using namespace std;
int main()
{
    int *ptr=new int[5];  // memory allocation using new operator.
    std::cout << "Enter 5 integers:" << std::endl;
    for(int i=1;i<=5;i++)
    {
        cin>>ptr[i];
    }
    std::cout << "Entered values are:" << std::endl;
        for(int i=1;i<=5;i++)
    {
        cout<<*(ptr+i)<<endl;
    }
    delete[] ptr; // deleting the memory block pointed by the ptr.
    std::cout << "After delete, the garbage value:" << std::endl;
        for(int i=1;i<=5;i++)
    {
        cout<<*(ptr+i)<<endl;
    }
 return 0;
}

输出

C++ free和delete的区别

delete和free()之间的差异

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

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程