C++中用于动态内存的new和delete运算符

C/C++中的动态内存分配是指由程序员手动进行内存分配。动态分配的内存在堆上分配,非静态和局部变量在上分配内存(有关详细信息,请参阅内存布局 C 程序)。
什么是应用程序?

  • 动态分配内存的一种用途是分配可变大小的内存,这在编译器分配的内存中是不可能的,除了可变长度数组。
  • 最重要的用途是为程序员提供的灵活性。我们可以在需要和不再需要时自由分配和释放内存。在许多情况下,这种灵活性会有所帮助。此类情况的示例是Linked List、Tree等。

它与分配给普通变量的内存有何不同?
对于“int a”、“char str[10]”等普通变量,内存会自动分配和释放。对于像“int *p = new int[10]”这样的动态分配内存,程序员有责任在不再需要时释放内存。如果程序员不释放内存,则会导致内存泄漏(直到程序终止时才会释放内存)。
在 C++ 中如何分配/释放内存?
C 使用malloc() 和 calloc()函数在运行时动态分配内存,并使用 free() 函数释放动态分配的内存。C++ 支持这些函数并且还有两个操作符newdelete以更好和更简单的方式执行分配和释放内存的任务。
这篇文章是关于 new 和 delete 操作符的。

new operator

new 运算符表示对 Free Store 的内存分配请求。如果有足够的内存可用,new 运算符会初始化内存并将新分配和初始化的内存的地址返回给指针变量。

  • 使用 new 运算符的语法:要分配任何数据类型的内存,语法是:
pointer-variable = new data-type;
  • 这里,指针变量是数据类型类型的指针。数据类型可以是任何内置数据类型,包括数组或任何用户定义的数据类型,包括结构和类。
    例子:
// Pointer initialized with NULL
// Then request memory for the variable
int *p = NULL; 
p = new int;   

            OR

// Combine declaration of pointer 
// and their assignment
int *p = new int; 
  • **初始化内存:**我们还可以使用 new 运算符为内置数据类型初始化内存。对于自定义数据类型,需要构造函数(以数据类型作为输入)来初始化值。这是初始化两种数据类型的示例:
pointer-variable = new data-type(value);
Example:
int *p = new int(25);
float *q = new float(75.25);

// Custom data type
struct cust
{
    int p;
    cust(int q) : p(q) {}
};

cust* var1 = new cust;    // Works fine, doesn't require constructor

        OR

cust* var1 = new cust();        // Works fine, doesn't require constructor


cust* var = new cust(25)        // Notice error if you comment this
  • 分配内存块: new 运算符也用于分配data-type 类型的内存块(数组)。
指针变量=新数据类型[大小];
  • 其中 size(a variable) 指定数组中元素的数量。
示例:
        int *p = new int[10]
  • 连续动态地为 10 个 int 类型的整数分配内存,并返回指向序列的第一个元素的指针,该指针分配给 p(a 指针)。p[0] 指第一个元素,p[1] 指第二个元素,依此类推。

C++中用于动态内存的new和delete运算符_第1张图片

普通数组声明与使用 new
声明普通数组和使用 new 分配一块内存是有区别的。最重要的区别是,普通数组由编译器释放(如果数组是本地的,则在函数返回或完成时释放)。但是,动态分配的数组始终保留在那里,直到它们被程序员释放或程序终止。
如果在运行时没有足够的内存可用怎么办?
如果堆中没有足够的内存来分配,新请求通过抛出 std::bad_alloc 类型的异常来指示失败,除非“nothrow”与 new 运算符一起使用,在这种情况下它返回一个 NULL 指针(滚动到本节中的“新运算符的异常处理”部分文章)。因此,在使用 it 程序之前检查 new 生成的指针变量可能是个好主意。

int *p = new(nothrow) int; 
if (!p) 
{ 
   cout << "内存分配失败\n"; 
}

删除运算符

由于释放动态分配的内存是程序员的责任,因此 C++ 语言为程序员提供了删除运算符。
句法:

// 释放指针变量指向的内存
delete pointer-variable;  

这里,指针变量是指向由new创建的数据对象的指针。
例子:

  删除 p; 
  删除q;

要释放指针变量指向的动态分配的数组,请使用以下形式的delete

// 释放内存块
// 指针变量指向
delete[] pointer-variable;  

示例:
   // 它将释放整个数组
   // p 所指向的。
   删除[] p;
  • CPP
// C++ program to illustrate dynamic allocation
// and deallocation of memory using new and delete
#include 
using namespace std;

int main ()
{
	// Pointer initialization to null
	int* p = NULL;

	// Request memory for the variable
	// using new operator
	p = new(nothrow) int;
	if (!p)
		cout << "allocation of memory failed\n";
	else
	{
		// Store value at allocated address
		*p = 29;
		cout << "Value of p: " << *p << endl;
	}

	// Request block of memory
	// using new operator
	float *r = new float(75.25);

	cout << "Value of r: " << *r << endl;

	// Request block of memory of size n
	int n = 5;
	int *q = new(nothrow) int[n];

	if (!q)
		cout << "allocation of memory failed\n";
	else
	{
		for (int i = 0; i < n; i++)
			q[i] = i+1;

		cout << "Value store in block of memory: ";
		for (int i = 0; i < n; i++)
			cout << q[i] << " ";
	}

	// freed the allocated memory
	delete p;
	delete r;

	// freed the block of allocated memory
	delete[] q;

	return 0;
}

输出:

p 的值:29 
r 的值:75.25
存储在内存块中的值:1 2 3 4 5

你可能感兴趣的:(C++程序教学,c++,开发语言,后端)