浅谈C++内存分配及变长数组的动态分配

2020-01-06 15:40:02王旭

设计数据结构,从根本上解决对象管理的混乱局面。

(2)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函

数体结束时被自动销毁。

(3)使用free或delete释放了内存后,没有将指针设置为NULL。导致产生“野指针”。

【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存

【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。

【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。

【规则4】动态内存的申请与释放必须配对,防止内存泄漏。

【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

二. 详解new,malloc,GlobalAlloc
   
1.  new

new和delete运算符用于动态分配和撤销内存的运算符

new用法:

1> 开辟单变量地址空间

1)new int;  //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new

int 即为将一个int类型的地址赋值给整型指针a.

2)int *a = new int(5) 作用同上,但是同时将整数赋值为5

2> 开辟数组空间

一维: int *a = new int[100];开辟一个大小为100的整型数组空间

一般用法: new 类型 [初值]

delete用法:

1> int *a = new int;

delete a;   //释放单个int的空间

2>int *a = new int[5];

delete [] a; //释放int数组空间

要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.

用new和delete可以动态开辟,撤销地址空间.在编程序时,若用完一个变量(一般是暂时存储的数组),

下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它.

2.  malloc

原型:extern void *malloc(unsigned int num_bytes);

用法:#i nclude <malloc.h>或#i nclude <stdlib.h>

功能:分配长度为num_bytes字节的内存块

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

当内存不再使用时,应使用free()函数将内存块释放。

malloc的语法是:指针名=(数据类型*)malloc(长度),(数据类型*)表示指针.

说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型

的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。

malloc()函数的工作机制