C/C++技巧
+ -

C/C++技巧 临时大内存代替malloc/new

2023-06-06 21 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];

0 篇笔记 写笔记

UNICODE_STRING的初始化
从UNICODE_STRING结构体的三个成员可以看到,其包含的是字符串的指针,字符串的实际长度和字符串指针的内存空间长。学过C语言的我们都知道,要对一个指针的内存进行赋值,就必须确定这个指针指向的内存空间可用,否则会导致内存使用异常。在应用层中会导致应用程序异常,而在驱动中会导致蓝屏。我们们这里使......
字符串UNICODE_STRING
在Windows下编程,根据字符串的使用分为UNICODE编程和我们平常使用的多字节编程。我们开发Windows驱动使用的是C语言。在C语言中定义的字符串是以为结尾表示一个字符串的结束。 char* pStr="www.pnpon.com";// ansi字符串 ......
UNICODE_STRING的拼接
像普通的字符串使用strcat一样,UNICODE_STRING也支持拼接功能。UNICODE_STRING的拼接按源字符的类型分为以下几中:RtlAppendUnicodeToString拼接将一个宽字节接接到UNICODE_STRING中。这里使用RtlAppendUnicodeToStrin......
UNICODE_STRING的打印
字符串的连接另一种常见的情况是字符串和数字的组合。有时数字需要被转换为字符串。有时需要把若干个数字和字符串混合组合起来。这往往用于打印日志的时候。日志中可能含有文件名、时间、和行号,以及其他的信息。熟悉C语言的读者会使用sprintf。这个函数的宽字符版本为swprintf。该函数在驱动开发中依然......
使用CLSIDFromString将字符串GUID转化成十六进制GUID/UUID
Windows的一般会给相同类型的设备接口注册相同的GUID,但GUID有时别人给的是一个字符串,但是在实际使用过程中我们又使用的是GUID类型,其结构定义如下:typedef struct _GUID { unsigned long Data1; unsigned short ......
UNICODE_STRING的拷贝复制
由于UNICODE_STRING和ANSI_STRING字符串是一个结构体,所以UNICODE_STRING和ANSI_STRING字符串的拷贝就不能使用wcscpy和strcpy来进行拷贝了。微软的WDK中提供了专门的函数RtlCopyUnicodeString和RtlCopyString来进行U......
Windows内核STRING转UNICODE
VOIDConvertToUnicodeString( IN CHAR * Buffer, IN ULONG ResultBufferLength, IN ULONG ResultBufferOffset, OUT LPWSTR ResultBuffer, ......
ANSI_STRING字符串与UNICODE_STRING字符串相互转换 - Windows内核模式下的字符串操作
函数名称:RtlUnicodeStringToAnsiString功能描述:将UNICODE_STRING字符串转化成ANSI_STRING字符串参数列表:DestinationString:需要转化的字符串SourceString:需要转换的原字符串AllocateDesctinationSt......
ASCII字符串和宽字符串处理
在驱动程序开发中,DDK将char和wchar_t类别,替换成CHAR和WCHAR类别驱动程序中用KdPrint打印ASCII字符串和宽字符串:打印ASCII字符串 CHAR *string = “Hello”;  KdPrint(“%s ”, string);打印WCHAR字符串  ......
字符串UNICODDE_STRING与整型数字相互转换
/************************************************************************  * 函数名称:RtlUnicodeStringToInteger  * 功能描述:UNICODE_STRING字符串转化成整型数字  * ......
C/C++技巧 临时大内存代替malloc/new
例如在某一函数中,需要频繁地申请数申请不定长数据内存,这样代码中大量充斥着很多的new ,delet或malloc,free。这样造成的结果就是实际功能没写多少,就不停地申请,判断,释放这样的操作了,严重地影响了我们写代码的流程。不爽啊!一般win32应用栈只有1M,故临时数据有限,而且随着函数......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!