C/C++技巧 临时大内存代替malloc/new
2023-06-06
26
0
例如在某一函数中,需要频繁地申请数申请不定长数据内存,这样代码中大量充斥着很多的new ,delet或malloc,free。这样造成的结果就是实际功能没写多少,就不停地申请,判断,释放这样的操作了,严重地影响了我们写代码的流程。不爽啊!
一般win32应用栈只有1M,故临时数据有限,而且随着函数的嵌套调用,可用栈会变小,会造成栈溢出,堆相对比较大,可需要我们手动进行内存管理。所在用下面的方法可以使用栈的方法来使用堆,简化了代码编写工作量。
例如:
void dothing()
{
//第一步
int nLen1 = GetDataLen();
PVOID pData1 = malloc(nlen1);
if(pData1 == NULL)
{
return ;
}
//第二步
int nLen2 = GetDataLen2();
PVOID pData2 = malloc(nlen2);
if(pData2 == NULL)
{
free(pData1);
pData1 = NULL;
return ;
}
//第三步. 类似这样的大操作
}
当然我们也可以梳理一下代码,改成do while(0)类型的,详见下一节。
对于这种频率的内存申请,释放,当然也可以进行内存管理,防止内存碎片导致申请失败。
其实我们可以使用stl如std::vector或std::string进行自动进行内存申请,因为这些c++的类型中自带进行内存管理,这样可以减少我们对内存进行管理。
例如说需要申请某一某长数据(这里为128),可以这样
#include<string>
void main()
{
int nSize = 128;
std::string data;
data.resize(128);
char* pData = (char*)&data.at(0);
}
这样就可以申请到需要的数据内存,其数据内存为堆,但由于data又是一个临时变量,这个函数范围内自动进行析构,除了释放其本身占的栈空间,还释入其数据的堆空间,是不是很省事。
当然如用有人觉地std::string看起来比较惯,可以用stl的vector;
std::string<unsigned char> data;
data.resize(128);
void* pData = (void*)&data[0];