Ben*_*son 0 c++ heap malloc free
嘿大家,我得到一堆腐败错误,我无法弄清楚.
char * c = (char *) malloc(1);
// main loop
_gcvt_s(c, 100, ball->get_X_Direction(), 10);
if(pushFont(c, (SCREEN_WIDTH - 30), (SCREEN_HEIGHT - 40), message, screen,
font, textColor) == false)
{
//return 1; // error rendering text.
}
// end main loop
free(c);
Run Code Online (Sandbox Code Playgroud)
上面的代码是我在_gcvt_s和pushFont()中使用c指针的唯一时间,它只接受char*作为其第一个参数,并将文本放在屏幕上.除此之外,我不使用c.当我尝试在主循环之后释放c(我认为我应该这样做)时,我得到一个错误,说Visual Studio已经获得了堆的错误(堆损坏).
注释掉对pushFont的调用我仍然收到错误.
任何人都可以向我解释为什么释放一个字符(我在堆上分配的1个字节)会给我一个堆损坏?
最后我的主循环做了很多东西,一个伙伴和我正在用WinSocket做一个乒乓球游戏,主体的其余部分是游戏的循环.我不认为有必要发帖,但如果有必要,我会用整个主循环更新我的帖子,但我相信我对malloc()和free()的理解是对的.
谢谢大家,
_gcvt_s不使用第二个参数作为分配缓冲区的最大大小?你分配1个字节,但告诉_gcvt_s有100个.所以它很高兴地将最多100个字节写入破坏你的堆的缓冲区.然后免费崩溃.如果要访问100个字节,则分配100个字节.
编辑:听起来你需要了解C如何存储和操作字符串.C将字符串存储为连续内存中的单个字节,后跟一个额外字符以指示字符串的结尾.此额外字符的ASCII值为0(不是字符'0',即ASCII 48).因此,如果你有一个像"HELLO"这样的字符串,它需要6个字节来存储 - 一个用于5个字母和终止符.
为了让_gcvt_s()将值返回到缓冲区,您需要为转换和额外的终止字节包含足够的字节.在_gcvt_s()的情况下,您要求10个字符的精度.但是你还必须保留小数点的空间,潜在的负号.
根据这个[文档](http://msdn.microsoft.com/en-us/library/a2a85fh5 ( VS.80).aspx),标题中有一个#define,用于缓冲区的最大必要大小: _CVTBUFSIZE.这个例子可以帮助你解决这个问题.
| 归档时间: |
|
| 查看次数: |
2013 次 |
| 最近记录: |