C++动态内存分配

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN视频网址:http://edu.csdn.net/lecturer/144

C / C ++中的动态内存分配是指程序员手动执行内存分配, 动态分配的内存分配给堆,非静态和局部变量获取在Stack上分配的内存。详情查看上篇博文:C程序的内存布局

什么是应用程序?
动态分配的内存的一个用途是分配可变大小的内存,除了可变长度数组之外,编译器是不可能分配内存的。
最重要的用途是为程序员提供灵活性,每当我们需要,并且我们不再需要了, 我们可以随时分配和释放内存,很多情况下,这种灵活性有所帮助, 这种例子是链接列表,树等。

与分配给正常变量的内存有什么不同?
对于“int a”,“char str [10]”等常规变量,内存将自动分配和释放。 对于动态分配的内存,如“int * p = new int [10]”,程序员有责任在不再需要时释放内存。 如果程序员没有释放内存,它会导致内存泄漏(内存没有释放,直到程序终止)。

什么是内存泄漏,如何避免?

当程序员在堆中创建内存并忘记删除内存时,会发生内存泄漏,内存泄漏对于程序而言是特别严重的问题。以下是内存泄漏的代码:

[cpp] view plain copy

  1. /* Function with memory leak */
  2. #include <stdlib.h>
  3. void f()
  4. {
  5. int *ptr = (int *) malloc(sizeof(int));
  6. /* Do some work */
  7. return; /* Return without freeing ptr*/
  8. }

为了避免内存泄漏,分配给堆上的内存应该不再需要时被释放。

[cpp] view plain copy

  1. #include <stdlib.h>;
  2. void f()
  3. {
  4. int *ptr = (int *) malloc(sizeof(int));
  5. /* Do some work */
  6. free(ptr);
  7. return;
  8. }

如何在C ++中分配/释放内存?
C使用malloc()和calloc()函数在运行时动态分配内存,并使用free()函数释放动态分配的内存。 C ++支持这些功能,并且还有两个运算符new和delete来执行分配和释放内存的任务。
这篇文章是关于new和delete的操作符。

new 操作符

new操作符表示堆上的内存分配请求。 如果有足够的内存可用,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);

分配内存块:new运算符也用于分配数据类型的内存块(数组)。

pointer-variable = new data-type[size];

其中size(一个变量)指定数组中的元素数。

int *p = new int[10]

动态地为类型int连续分配10个整数的内存,并返回指向序列的第一个元素的指针,分配给p(指针), p [0]是指第一个元素,p [1]是指第二个元素等等。

数组声明用new操作符

声明数组和使用new内存块分配最重要的区别是,数组由编译器释放(如果数组是本地的,则在函数返回或完成时释放)。 但是,动态分配的数组总是保留在那里,直到它们被程序员或程序终止释放。

如果运行时内存不足,怎么办?
如果堆中没有足够的内存可用于分配,则new请求通过抛出类型为std :: bad_alloc的异常来指示失败,而new操作符返回一个指针。 因此,在使用该程序之前,检查新的指针变量可能是一个好主意。

int *p = new int;
if (!p)
{
   cout << "Memory allocation failed\n";
}

delete操作符

既然程序员有责任释放动态分配的内存,所以使用C ++语言为程序员提供了delete操作符。

delete pointer-variable;

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

  delete p;
  delete q;

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

// Release block of memory
// pointed by pointer-variable
delete[] pointer-variable;  

Example:
   // It will free the entire array
   // pointed by p.
   delete[] p;

完整的案例代码如下所示:

[cpp] view plain copy

  1. #include <iostream>
  2. using namespace std;
  3. int main ()
  4. {
  5. // Pointer initialization to null
  6. int* p = NULL;
  7. // Request memory for the variable
  8. // using new operator
  9. p = new int;
  10. if (!p)
  11. cout << "allocation of memory failed\n";
  12. else
  13. {
  14. // Store value at allocated address
  15. *p = 29;
  16. cout << "Value of p: " << *p << endl;
  17. }
  18. // Request block of memory
  19. // using new operator
  20. float *r = new float(75.25);
  21. cout << "Value of r: " << *r << endl;
  22. // Request block of memory of size n
  23. int n = 5;
  24. int *q = new int[n];
  25. if (!p)
  26. cout << "allocation of memory failed\n";
  27. else
  28. {
  29. for (int i = 0; i < n; i++)
  30. q[i] = i+1;
  31. cout << "Value store in block of memory: ";
  32. for (int i = 0; i < n; i++)
  33. cout << q[i] << " ";
  34. }
  35. // freed the allocated memory
  36. delete p;
  37. delete r;
  38. // freed the block of allocated memory
  39. delete[] q;
  40. return 0;
  41. }

输出结果:

Value of p: 29
Value of r: 75.25
Value store in block of memory: 1 2 3 4 5 

http://www.woaipu.com/shops/zuzhuan/61406
http://nanning.xjwy.cn/f/bencandy.php?fid=43&id=117777
http://nanning.xjwy.cn/f/bencandy.php?fid=43&id=117890
http://nanning.xjwy.cn/f/bencandy.php?fid=43&id=117994
http://nanning.xjwy.cn/f/bencandy.php?fid=43&id=118376

				
时间: 2024-08-02 02:51:21

C++动态内存分配的相关文章

【C语言天天练(九)】动态内存分配

引言:数组的元素存储于内存中连续的位置上.当一个数组被声明时.它所须要的内存在编译时就被分配. 可是,我们能够使用动态内存分配在执行时为它分配内存. 一块内存的生命周期能够分为四个阶段:分配.初始化.使用.释放. 内存的分配一般使用C函数库里的malloc函数(原型:void *malloc(size_t size)). 关于malloc函数应该注意一下几点: 1.malloc的參数就是须要分配的内存的字节数. 2.malloc所分配的是一块连续的内存. 3.分配成功.则返回指向分配内存起始地址

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ

继承和动态内存分配

假设基类使用了动态内存分配,而且定义了析构函数.复制构造函数和赋值函数,但是在派生类中没有使用动态内存分配,那么在派生类中不需要显示定义析构函数.复制构造函数和赋值函数. 当基类和派生类采用动态内存分配时,派生类的析构函数.复制构造函数.赋值运算符都必须使用相应的基类方法来处理基类元素.这种要求是通过三种不同的方式来满足的.对于析构函数.这是自动完成的,也就是说在派生类的析构函数中无需显示调用基类的析构函数.对于构造函数,这是通过在初始化成员类别中调用基类的复制构造函数来完成的,如果不这样做,将

【Cpp】考点·堆栈&amp;动态内存分配

动态内存分配 堆内存分配与释放 C/C++定义了四个内存区间:代码区,全局变量与静态变量区,局部变量区(栈区),动态内存区(堆区) 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配.有些操作对象只在程序运行时才确定,这样编译时无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配.所有动态存储分配都在堆区中进行. 当程序运行到需要一

C++ 动态内存分配(6种情况,好几个例子)

1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配: 有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分

28._动态内存分配

动态内存分配 传统数组的缺点(静态内存分配):   1.数组长度必须事先指定,且只能是常整数,不能是变量    例子:     int a[5]; //OK     int len = 5; int a[len]; //error   2.传统形式定义的数组,该数组的内存程序员无法手动编    程释放,在一个函数运行期间,系统为该函数中数组所     分配的空间会一直存在,直到该函数运行完毕时,数组    元素所占存储空间才会被系统释放 3.数组的长度一旦定义,长度就能被改变     4.A函数

一维和二维数组 动态内存分配

一维数组的动态内存分配 #include "stdafx.h" #include <iostream> using namespace std; int main() { int length,i; int *p; cin>>length; p=new int[length]; for(i=0;i<length;i++) { p[i]=i; //不要写成*p[i]=i; cout<<p[i]<<endl; //不要写成cout<

Lesson(DynamicMerry)动态内存分配

//  main.m //  1-27随堂笔记 //讲师: 小辉 //笔者: 王学文 //  Created by lanouhn on 15/1/27. //  Copyright (c) 2015年 lanouhn. All rights reserved. //动态内存分配(DynamicMerry) #import <Foundation/Foundation.h> void test() { int x = 10; int y = 20; } //函数返回栈区的数据,是不安全的;一i

动态内存分配函数与释放函数

(1)分配函数 void *malloc(sizeof(unsigned size) 功能:在内存的动态存储区中分配一块长度位size的连续空间. 返回值:指针,存放被分配内存的起始地址.若未申请到空间,则返回NULL(0). void *:指向任何类型的数据,在使用时,要进行强制类型转换. 例如:int *malloc(sizeof(int)) struct student *malloc(sizeof(struct student)) (2)释放函数 void free(void *ptr)