内存分配和销毁-问题
例子1:
LPCSTR pc=(LPCSTR) malloc(15);
delete pc;
例子2:
LPCSTR pc= new char[15];
free((void*)pc);
-------------------------
例子1和例子2这样的内存分配和销毁是否合法?为什么?
好像delete 内部也用到 free?
-------------------------
例子3:
LPCSTR pc= new char[15];
GlobalFree((HGLOBAL) pc);
这样会报错:
HEAP[090903.exe]: Invalid Address specified to RtlFreeHeap( 00620000, 006018C8 )
--------------------------------
例子4:
LPSTR pc=(LPSTR)GlobalAlloc(GPTR,15);
free((void*)pc);
代码报错:
HEAP[090903.exe]: Invalid Address specified to RtlFreeHeap( 00C90000, 001F62B8 )
--------------------------------
例子5:
函数
BOOL __stdcall Example(LPSTR pc,DWORD buflen,LPDWORD returnbuflen){
if(pc!=NULL){
free((void*) pc);
pc=(LPSTR) malloc(buflen);
}
//这里为其他代码......
return (FALSE);
}
上面的
if(pc!=NULL){
free((void*) pc);
pc=(LPSTR) malloc(buflen);
}
这样的代码对不对? 我只想对外部的数据不感觉安全(如果存在缓冲区溢出),所以想释放再分配,运行居然成功了! 但如果pc在外部不是用malloc分配的,如果是用new,用GlobalAlloc,这样的代码是不是有问题了??高人讲解一下,诸如BOOL __stdcall Example(LPSTR pc,DWORD buflen,LPDWORD returnbuflen)就像GetWindowsDirectory函数类似的函数,需要用char*指针、缓冲字符作为参数的,应该如何代码编写就是正确的,以及如何防止类似的代码缓冲区溢出?????
---------------------------------------------------------------
这样对不对
bool __stdcall CharToLowerA( const char* oriChars,char* lowChars,size_t lowCharsLen){
if(oriChars==0 ||lowCharsLen==0) return false;
lowChars= new char[lowCharsLen];
for(size_t i =0;i<lowCharsLen;i++){
lowChars[i]=(char)tolower( oriChars[i]);//Asni使用tolower
}
lowChars+='\0';
return true;
}
LPCSTR pc=(LPCSTR) malloc(15);
delete pc;
例子2:
LPCSTR pc= new char[15];
free((void*)pc);
-------------------------
例子1和例子2这样的内存分配和销毁是否合法?为什么?
好像delete 内部也用到 free?
-------------------------
例子3:
LPCSTR pc= new char[15];
GlobalFree((HGLOBAL) pc);
这样会报错:
HEAP[090903.exe]: Invalid Address specified to RtlFreeHeap( 00620000, 006018C8 )
--------------------------------
例子4:
LPSTR pc=(LPSTR)GlobalAlloc(GPTR,15);
free((void*)pc);
代码报错:
HEAP[090903.exe]: Invalid Address specified to RtlFreeHeap( 00C90000, 001F62B8 )
--------------------------------
例子5:
函数
BOOL __stdcall Example(LPSTR pc,DWORD buflen,LPDWORD returnbuflen){
if(pc!=NULL){
free((void*) pc);
pc=(LPSTR) malloc(buflen);
}
//这里为其他代码......
return (FALSE);
}
上面的
if(pc!=NULL){
free((void*) pc);
pc=(LPSTR) malloc(buflen);
}
这样的代码对不对? 我只想对外部的数据不感觉安全(如果存在缓冲区溢出),所以想释放再分配,运行居然成功了! 但如果pc在外部不是用malloc分配的,如果是用new,用GlobalAlloc,这样的代码是不是有问题了??高人讲解一下,诸如BOOL __stdcall Example(LPSTR pc,DWORD buflen,LPDWORD returnbuflen)就像GetWindowsDirectory函数类似的函数,需要用char*指针、缓冲字符作为参数的,应该如何代码编写就是正确的,以及如何防止类似的代码缓冲区溢出?????
---------------------------------------------------------------
这样对不对
bool __stdcall CharToLowerA( const char* oriChars,char* lowChars,size_t lowCharsLen){
if(oriChars==0 ||lowCharsLen==0) return false;
lowChars= new char[lowCharsLen];
for(size_t i =0;i<lowCharsLen;i++){
lowChars[i]=(char)tolower( oriChars[i]);//Asni使用tolower
}
lowChars+='\0';
return true;
}
...全文
相关推荐
《对话框》之《内存分配方式和调试机制》
C++的new和delete操作符是面向对象编程中的内存管理工具,它们分别对应于动态对象的创建和销毁。
45、内核模块作者的内核内存分配(第二部分)
本文详细介绍了Linux内核模块开发中的内存管理技术,包括创建和使用自定义slab缓存、内核内存分配API如vmalloc的使用、内存回收机制以及OOM杀手的工作原理。通过示例代码和调试方法,帮助开发者更好地理解和优化内核模块的内存性能,提高系统的稳定性和效率。
内存分配问题与调试机制
内存分配在计算机编程中是至关重要的,特别是在C和C++这样的低级语言中。本文将深入探讨内存分配问题,特别是MFC、Win32以及C语言API中的内存管理机制。首先,我们来看Win32的堆分配函数。
内存分配方式和调试机制.doc
内存分配在计算机编程中至关重要,因为它涉及到程序如何管理和使用存储空间。本文主要讲解了四种内存分配方式,并提及了调试机制,这些都是开发过程中理解和解决内存问题的关键。
内存分配与回收设计代码
**内存碎片**:在频繁进行内存分配和回收的过程中,可能会产生内存碎片,即无法使用的内存块。连续分配(如`malloc`和`calloc`)和内存池技术可以缓解这个问题。5.


