C++ 字符数组的malloc内存导致访问冲突
这可能是一个很难回答的问题。我正在使用果酱SDK。如果我动态地为一个字符数组分配一些内存,我会得到一个访问冲突。我不知道我做错了什么。 这是使用malloc和free的有效方法吗C++ 字符数组的malloc内存导致访问冲突,c++,malloc,free,marmalade,C++,Malloc,Free,Marmalade,这可能是一个很难回答的问题。我正在使用果酱SDK。如果我动态地为一个字符数组分配一些内存,我会得到一个访问冲突。我不知道我做错了什么。 这是使用malloc和free的有效方法吗 const char* CClass::caption(int something) { ... //char stringPrediction[2000]; // <--- This works size_t string01_Size = strlen(string01);
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 ;
}
然后,我使用它设置按钮单击事件上标签的标题
... 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);
一,。
你不是在测试malloc失败的情况。该错误表明您正在尝试取消引用空指针—malloc失败时返回的指针
二,。
在计算缓冲区大小时,您似乎没有考虑空字节终止符。假设string01\u Size
和string02\u Size
是不包括空字节的字符数,则缓冲区溢出
这两个操作都会导致未定义的行为。在调用malloc或free期间遇到的访问冲突在大多数情况下表示堆已损坏。由于,最常见的是在悬空指针上发出的溢出或双自由或自由,发生在早些时候。可能要早得多 从发布的代码中无法推断,因为它实际上是从崩溃开始的 为了解决这个问题,你可以尝试valgrind,AppVerifier,以及其他帮助解决腐败问题的运行时工具。对于一个特殊的问题——对于一般来说,您首先不应该在那里,使用malloc、str*函数和从C继承的所有垃圾
一致使用集合类、字符串类等可以防止过多的情况导致严重的问题。您基本上已经发现了问题:如果不为第二个strcat分配空间,那么它将溢出,并且可能会压缩下一个块的堆指针。需要注意的其他事项(您可能正在这样做)是在重新分配之前释放CClass::caption()中的stringX,这样您就不会泄漏。无论什么,您都应该在使用之前检查malloc是否失败
正如其他人所建议的,使用std::string可能更好。如果需要,您始终可以将其转换为char*。当然,如果你这样做了,你应该考虑到异常会被抛出并相应地编程。不相关(或者是?)<代码> STD::String < /C> >有什么不对吗?你能告诉我们String 01IsString + String 02Syth+ 1的结果吗?String 01和String 02?在C++中是100%合法的。@ RjRAJ,虽然问题措辞不好,但是显然它不是代码> > MalCube()/Script本身。如果
string01_Size
和string02_Size
有效,则在第二次调用struccat
时,可能会超出数组stringX
,因为串联字符串之间有额外的空间。
stringX = (char *)malloc(string01_Size + 1 + string02_Size + 1);