内存分配和销毁-问题

RFEZGC 2010-04-11 12:23:42
例子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;

}
...全文
160 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
RFEZGC 2010-04-26
  • 打赏
  • 举报
回复
怎么没人回答呢
我想再看看 多一些
RFEZGC 2010-04-13
  • 打赏
  • 举报
回复
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;

}
这个函数的写法好像有问题
返回的参数lowChars是一堆乱码
为什么
高手解答下
野男孩 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 rfezgc 的回复:]
类似于GetWindowsDirectory 之类需要用户设置缓冲区大小 的api函数, 象这样的函数 如何设计 ,谢谢了
----------------------------
[/Quote]

没什么复杂的,就是由调用者分配好内存,函数里面直接用就行了。出错了就出错了,因为是调用者自己的错,由调用者自己承担责任。
RFEZGC 2010-04-13
  • 打赏
  • 举报
回复
能否给个例子 看看
RFEZGC 2010-04-13
  • 打赏
  • 举报
回复
类似于GetWindowsDirectory 之类需要用户设置缓冲区大小 的api函数, 象这样的函数 如何设计 ,谢谢了
----------------------------
白云飘飘飘 2010-04-11
  • 打赏
  • 举报
回复
一般情况下,c运行时在程序启动时会分配一个堆,程序中的动态内存都是用HeapAlloc和HeapFree中这个堆中分配的释放的。malloc和free分别是对这两个系统API的包装。为了增加对面向对象编程的支持,c++中使用new和delete,new和delete是对malloc和free的包装,但new分配内存后会调用对象的构造函数,free释放内存前要调用对象的析构。所它们是不能混用的。不过事实上对于构造和析构函数并不做实际工作的对象的分配来说,混用并不会出现问题。比如基本的数据类型。
GlobalAlloc和GlobalFree是从16位Windows遗留下来的,它们的存在一是为了兼容老的程序,二是被用做一引起特殊的地方,在32位系统中要使用HeapAlloc和HeapFree.这两对API操作的堆是不一样的,绝对不要混用。
通常,在同一模块内,内存都是在同一个堆上分配的,所以在一个模块内的一个地方分配内存,在另一个地方释放内存是安全的。
当程序有多个模块时,它们通常都有自己的堆,因此从一个模块中分配的内存在另一个模块中是不能释放的。比如在主程序和dll之间。
lmxmx 2010-04-11
  • 打赏
  • 举报
回复
我记得调试的时候

new最终就是malloc(),
delete最终就是free(),

但是没试过new、free,malloc、delete混用……
vc1000 2010-04-11
  • 打赏
  • 举报
回复
new与delete一起使用
malloc与free一起使用
不能混淆
白云飘飘飘 2010-04-11
  • 打赏
  • 举报
回复
通常,使用动态内存要遵循谁分配谁释放的原则:比如对于bool __stdcall CharToLowerA( const char* oriChars,char* lowChars,size_t lowCharsLen);来说,lowChars要由调用者来提供。
不考虑内存分配的问题,你这个函数有一个错误,lowChars是传递不回调用者的。

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧