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++动态内存分配研究

  • 2010年05月31日 14:37
  • 89KB
  • 下载

动态内存分配C++实例

  • 2011年10月08日 08:31
  • 123KB
  • 下载

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

假设基类使用动态内存分配,并重新定义了赋值和复制构造函数 class class_a { private: char* a; int rating; public: cl...

【C++基础】动态内存分配

在程序运行的过程中,我们需要能够自由地创建和销毁对象。 在C中,提供了动态内存分配(dynemic memory alloction)函数malloc()和free(),这些函数可以在运行时从堆中分配...

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

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

C和C++ 语言动态内存分配

C和C++ 语言动态内存分配  (转自:要八戒更要悟空 http://www.cnblogs.com/zhj202190/archive/2011/05/11/2043620.html) ...

c/c++ 动态内存分配与释放特点

一、先来谈谈在C语言下,动态内存分配和释放的特点。 动态分配内存的定义是这样的,指在程序运行过程中,要申请内存,系统会根据程序的实际情况来分配,分配空间的大小是由程序的需求来决定的。在C语言下面,举...

百度电面题 C和C++ 语言动态内存分配 的区别

一、C语言动态内存分配     要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数。(使用时应包含头文件“alloc.h”或“malloc.h”或“stdl...

C++ 笔记 关于动态内存分配 (new / delete)

C语言里面的动态内存分配用的是malloc()/calloc()和free()其中,malloc用于分配一个单位的内存,返回指针。例如malloc(sizeof int) calloc用于分配多个内...

c++类和动态内存分配

动态内存和类 特殊成员函数 1默认构造函数,如果你没有定义构造函数 2默认的析构函数,如果你没有定义析构函数 3复制构造函数,如果你没有定义 4赋值运算符,如果你没有定义 5地址运算符,如果你妹你没有...
  • god_wen
  • god_wen
  • 2016年09月30日 21:19
  • 467
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++动态内存分配
举报原因:
原因补充:

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