C++ Free vs Delete

C++ Free vs Delete 首页 / C++入门教程 / C++ Free vs Delete

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

free()函数

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

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

链接:https://www.learnfk.comhttps://www.learnfk.com/c++/free-vs-delete-in-cpp.html

来源:LearnFk无涯教程网

free(ptr);

上面的语法将取消分配指针变量" ptr"的内存。

free()参数

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

  • 如果指针为null,则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);

	/* 在 ptr 空闲后打印一个垃圾值 */
	cout << "Garbage Value" << endl;

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

上面的代码显示了free()函数如何与malloc()一起工作。首先,我们声明整数指针* ptr,然后使用malloc()函数将内存分配给该指针变量。现在,ptr指向5个整数的未初始化存储块。分配内存后,我们使用free()函数破坏此分配的内存。当我们尝试打印由ptr指向的值时,会得到一个垃圾值,这意味着内存已被取消分配。

输出

free vs delete in C++

让我们看看free()函数如何与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分配了一个内存块,该内存块可以具有单个浮点类型值。

输出:

free vs delete in C++

让我们看看另一个示例。

#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()函数如何与NULL指针一起工作。我们声明了两个指针,即ptr1和ptr2。我们为指针ptr1分配NULL值,为指针ptr2分配x变量的地址。当将free(ptr1)函数应用于ptr1时,分配给ptr的存储块将成功释放。语句free(ptr2)显示运行时错误,因为未使用malloc或calloc函数分配分配给ptr2的内存块。

free vs delete in C++

delete运算符

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

语法

delete pointer_name

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

delete p;

要删除数组,我们使用以下语句:

delete [] p;

与delete运算符有关的一些重要要点是:

  • 它用于delete使用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指向的内存块。

输出

free vs delete in C++

让我们看看删除如何与一系列对象一起工作。

#include <iostream>
using namespace std;
int main()
{
    int *ptr=new int[5]; //使用 new 运算符分配内存。
    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;//删除ptr指向的内存块。
    std::cout << "After delete, the garbage value:" << std::endl;
        for(int i=1;i<=5;i++)
    {
        cout<<*(ptr+i)<<endl;
    }
    return 0;
}

输出

free vs delete in C++

delete和free()区别

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

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

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

代码精进之路 -〔范学雷〕

白话法律42讲 -〔周甲徳〕

浏览器工作原理与实践 -〔李兵〕

分布式金融架构课 -〔任杰〕

Redis源码剖析与实战 -〔蒋德钧〕

数据分析思维课 -〔郭炜〕

大数据经典论文解读 -〔徐文浩〕

攻克视频技术 -〔李江〕

零基础GPT应用入门课 -〔林健(键盘)〕

好记忆不如烂笔头。留下您的足迹吧 :)