C++内存管理(上)


我们在编程的时候经常性的遇到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里面的mallocfree函数,在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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值