我们在编程的时候经常性的遇到C++内存方面的问题,现在简单的说说C++的内存管理。
1.使用动态内存的主要优点:
(1)不同的对象和函数之间可以共享动态内存。
(2)可以在运行时确定动态内存分配的大小。
2.内存描述
(1) int i = 123; //表示定义了一个变量 它的值为123这个变量被分配在堆栈上
(2) int *pInt ;
pInt= new int; //使用new关键字分配内存时,内存被分配在堆上,这两句代码表示在堆栈上创建了一个变量pInt,然后在堆上分配了内存,pInt指向这块内存。
3.内存的分配和释放
使用new关键字进行内存的申请,delete关键字进行内存的释放。
例如:
int*pInt;
pInt= new int;
delete*pInt;
提示:经验告诉我们:每行通过new分配内存的代码都应该有一行对应放入用delete释放同一块内存的代码。
4.一些值得注意的地方
Google编码风格里面说到C++中严禁使用alloca()¶函数,但是在此也想补充说明一些,我们尽量不使用C里面的malloc和free函数,在C++里面,内存的分配上有一定的差别,例如:
Test* pTest = (Test*)malloc(sizeof(Test)); //使用C风格动态申请内存
Test* pTest = new Texst[]; //使用C++风格动态申请内存。
我们在代码中可以试验一下:后者在运行时会调用类的构造函数。
(在使用delete时,当然也会发现调用了构造函数)
5.数组的内存分配
简单说一下二维数组的申请和释放。
#include"stdafx.h"
#include<iostream>
usingnamespacestd;
int**newArray(size_txSize,size_tySize)
{
int**arrTest= newint*[xSize];
for(size_ti=0;i<ySize;i++)
arrTest[i]= newint[ySize];
returnarrTest;
}
voidinitArray(int**arrTest,size_txSize,size_tySize)
{
for(size_ti=0;i<xSize;i++)
for(size_tj=0;j<ySize;j++)
arrTest[i][j]= i+j;
}
voidprintArray(int**arrTest,size_txSize,size_tySize)
{
for(size_ti=0;i<xSize;i++)
{
for(size_tj=0;j<ySize;j++)
cout<<arrTest[i][j]<<" ";
cout<<endl;
}
}
voidfreeArrary(int**arrTest,size_txSize)
{
for(size_ti=0;i<xSize;i++)
delete[]arrTest[i];
delete[]arrTest;
}
int_tmain(intargc,_TCHAR*argv[])
{
int**arr= newArray(5,5);
initArray(arr,5,5);
printArray(arr,5,5);
freeArrary(arr,5);
getchar();
return0;
}
此段代码能够说明如何生成简单的二维数组,其中读者可以根据二维数据进行多维数组的扩展.(在此强烈建议使用Verctor代替一维数组)
6.以前遇到过别人问这样一个问题.
int*pInt; pInt = new int(3); cout<<pInt[0]<<endl;
在此说明一下,指针pInt时一个指针,当然你可以通过数组的方式去访问指针的第一个元素,但是这样的风格不好,而且没有任何好处,可能会导致bug.