Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;检测到堆损坏";将指针传递给函数时,然后对指针调用free()_C++_Malloc_Free_Char Pointer - Fatal编程技术网

C++ &引用;检测到堆损坏";将指针传递给函数时,然后对指针调用free()

C++ &引用;检测到堆损坏";将指针传递给函数时,然后对指针调用free(),c++,malloc,free,char-pointer,C++,Malloc,Free,Char Pointer,VisualStudio2010 当我为一个字符字符串分配内存时,将字符串(指针)传递给一个函数,然后尝试释放内存,我会得到一个“Heap corrupt Detected”运行时错误 我怀疑这是函数在内存返回时将其标记为“已释放”的结果,但我仍然不知道如何解决这个问题。简单地取消对free()的调用,我感到不舒服 当使用chars时,您在malloc末尾添加的+1将仅为空终止符分配足够的内存,因为chars是1字节(因此空终止符将占用1字节) 由于您使用的是wchar\u t,空终止符将占用s

VisualStudio2010

当我为一个字符字符串分配内存时,将字符串(指针)传递给一个函数,然后尝试释放内存,我会得到一个“Heap corrupt Detected”运行时错误

我怀疑这是函数在内存返回时将其标记为“已释放”的结果,但我仍然不知道如何解决这个问题。简单地取消对free()的调用,我感到不舒服


当使用
char
s时,您在
malloc
末尾添加的
+1
将仅为空终止符分配足够的内存,因为
char
s是1字节(因此空终止符将占用1字节)

由于您使用的是
wchar\u t
,空终止符将占用
sizeof(wchar\u t)
字节,这实际上总是大于1。因此,
malloc
调用分配的内存不足。重新构造您的
malloc
调用,如下所示:

wchar_t * wMsg = (wchar_t*) malloc((strlen(msg) + 1) * (sizeof(wchar_t));

这样,分配的总字节数为空终止符留出了空间。

malloc
末尾添加的
+1
在使用
char
s时,只会为空终止符分配足够的内存,因为
char
s是1个字节(因此空终止符将占用一个字节)

由于您使用的是
wchar\u t
,空终止符将占用
sizeof(wchar\u t)
字节,这实际上总是大于1。因此,
malloc
调用分配的内存不足。重新构造您的
malloc
调用,如下所示:

wchar_t * wMsg = (wchar_t*) malloc((strlen(msg) + 1) * (sizeof(wchar_t));

这样,分配的总字节数为空终止符留出了空间。

即使宽字符串的终止nul也是宽的,因此只给它一个字节是不够的。更改:

wchar_t * wMsg = (wchar_t*)malloc((strlen(msg) * sizeof(wchar_t)) + 1);


即使宽字符串的终止nul也是宽的,所以只给它一个字节是不够的。更改:

wchar_t * wMsg = (wchar_t*)malloc((strlen(msg) * sizeof(wchar_t)) + 1);


另一个注意事项:strlen是O(n),所以您应该计算一次并将其缓存在局部变量中,而不是调用它3次。谢谢,这就是它。在内存中添加额外的空间使程序运行无误。我还将对strlen()的调用合并到一个调用中。另一个注意:strlen是O(n),因此您应该计算一次并将其缓存在局部变量中,而不是调用3次。谢谢,这就是它。在内存中添加额外的空间使程序运行无误。我还将对strlen()的调用合并为一个调用。对于将来的引用,“检测到堆损坏”几乎总是意味着您的写入超过了动态分配的数组的结尾。例如,95%的时间。对于将来的引用,“检测到堆损坏”几乎总是意味着您写的内容超过了动态分配数组的结尾。比如,95%的时间。谢谢,就是这样。在内存中添加额外空间使程序运行时不会出错。从第一次开始1分钟后就标记为正确。谢谢,就是这样。在内存中添加额外空间使程序运行时不会出错。Mar因为你以1分钟的优势领先,所以被认为是正确的。