C++动态内存分配

原创 2017年06月06日 16:03:02

笔者介绍:姜雪伟,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]”,程序员有责任在不再需要时释放内存。 如果程序员没有释放内存,它会导致内存泄漏(内存没有释放,直到程序终止)。

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

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

/* Function with memory leak */
#include <stdlib.h>
 
void f()
{
   int *ptr = (int *) malloc(sizeof(int));
 
   /* Do some work */
 
   return; /* Return without freeing ptr*/
}
为了避免内存泄漏,分配给堆上的内存应该不再需要时被释放。

#include <stdlib.h>;
 
void f()
{
   int *ptr = (int *) malloc(sizeof(int));
 
   /* Do some work */
 
   free(ptr);
   return;
}
如何在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;

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

#include <iostream>
using namespace std;
 
int main ()
{
    // Pointer initialization to null
    int* p = NULL;
 
    // Request memory for the variable
    // using new operator
    p = new 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 int[n];
 
    if (!p)
        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;
}
输出结果:

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

C++之继承和动态内存分配

C++之继承和动态内存分配
  • sunfei2
  • sunfei2
  • 2014年04月04日 20:07
  • 591

继承之动态内存分配&深拷贝浅拷贝

baseDMA.h #ifndef BASEDMA_H_ #define BASEDMA_H_ #include //基类 class baseDMA { private: char *lab...
  • qq_25235869
  • qq_25235869
  • 2016年03月31日 00:10
  • 277

C++ 学习(继承和动态内存分配)

1> 派生类不使用newclass baseDMA{ private: char * label; int rating; public: baseDMA(const char ...
  • u013570474
  • u013570474
  • 2015年11月21日 14:33
  • 170

c++动态内存分配

用new 运算符实现动态内存分配 OP1: P = new T; T是任意类型名,P是类型为T * 的指针。 动态分配出一片大小为 sizeof(T)字节的内存空间,并且将该 内存空间的起始地址赋...
  • p641290710
  • p641290710
  • 2014年06月03日 21:41
  • 664

C++继承关系中的动态内存分配

假设基类使用动态内存分配,并重新定义了赋值和复制构造函数 class class_a { private: char* a; int rating; public: cl...
  • KingCat666
  • KingCat666
  • 2015年04月07日 21:31
  • 709

C/C++动态分配与释放内存的区别详细解析

转自http://www.jb51.net/article/41723.htm 1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配。 ...
  • a573233077
  • a573233077
  • 2016年01月14日 16:59
  • 3519

C++:编写一个程序,用动态分布分配空间的方法计算Fibonacci数列的前二十项并存储到动态分布的空间中

#include  //预操作 using namespace std;//  使用命名空间std int main() { int i,sum=0; int *p; p = new in...
  • yuan_crazycode
  • yuan_crazycode
  • 2016年05月15日 12:10
  • 2085

【面向对象】类和动态内存分配

类和动态内存分配 编译器生成的函数
  • wupenm
  • wupenm
  • 2015年09月02日 19:17
  • 1273

C++ 高级数据类型(四)—— 动态内存分配

到目前为止,我们的程序中我们只用了声明变量、数组和其他对象(objects)所必需的内存空间,这些内存空间的大小都在程序执行之前就已经确定了。但如果我们需要内存大小为一个变量,其数值只有在程序运行时 ...
  • zqixiao_09
  • zqixiao_09
  • 2016年05月22日 12:30
  • 1073

2015级C++第9周项目 动态存储分配及深复制

【项目1-深复制体验】 (1)阅读下面的程序,补足未完成的注释#include #include using namespace std; class A { private: char *...
  • sxhelijian
  • sxhelijian
  • 2016年04月21日 19:57
  • 1864
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++动态内存分配
举报原因:
原因补充:

(最多只允许输入30个字)