这可能是一个菜鸟问题。我正在使用Marmalade SDK。如果我动态地为char数组分配一些内存,我会遇到访问冲突。我无法弄清楚我做错了什么。 这是使用malloc和free的有效方法吗?
const char* CClass::caption(int something)
{
...
//char stringPrediction[2000]; // <--- This works
size_t string01_Size = strlen(string01);
size_t string02_Size = strlen(string02);
...
stringX = (char *)malloc(string01_Size + string02_Size + 1); // <- Access violation
strcpy(stringX , string01);
strcat(stringX , " ");
strcat(stringX , string02);
return stringX ;
}
析构函数:
CClass::~CClass(void)
{
free(stringX);
}
然后我用它在Button click事件
上设置标签的标题... OnClick...(...)
{
CClass someObject;
label.setCaption(someObject.caption());
}
点击几下后,我就会遇到访问冲突。
Unhandled exception at 0x1007ECB8 (s3e_simulator_debug.dll) in
s3e_simulator_debug.exe: 0xC0000005: Access violation writing
location 0x0000000C.
编辑:似乎问题是:
stringX = (char *)malloc(string01_Size + string02_Size + 1);
我没有为此分配空间:
strcat(stringX , " ");
这应该更好:
stringX = (char *)malloc(string01_Size + 1 + string02_Size + 1);
答案 0 :(得分:0)
1。 您没有测试malloc失败的情况。该错误表明您正在尝试取消引用空指针 - 当malloc失败时返回指针。
2。
在计算缓冲区大小时,您看起来并不是在考虑空字节终止符。假设string01_Size
和string02_Size
是不包括空字节的字符数,那么你的缓冲区就会溢出。
这两个动作都会导致未定义的行为。
答案 1 :(得分:0)
在调用malloc期间遇到访问冲突或在大多数情况下是空闲时表示堆已损坏。由于最常见的超支或双重免费或免费发布悬挂指针,发生在某个时间之前。可能早一点。
从发布的代码中无法推断,因为它实际上是从崩溃开始的。
要处理它,你可以尝试valgrind,app verifier,其他运行时工具来帮助腐败。对于那个特定问题 - 对于一般情况,你不应该首先使用malloc,str *函数来自C的所有继承的废话。
一致地使用集合类,String类等会阻止太多导致严重问题的案例。
答案 2 :(得分:0)
你基本上发现了这个问题:通过不为空间分配你的第二个strcat将会溢出并可能会破坏下一个块的堆指针。另外要注意的事情(你可能还是这样做)是在重新分配之前在CClass :: caption()中释放stringX,这样你就不会泄漏。无论你真的应该检查malloc在使用前没有失败。
正如其他人所建议的那样,使用std :: string可能更好。如果需要,您始终可以将这些转换为char *。当然,如果你这样做,你应该考虑抛出异常并相应编程。