在我的模板功能中,我有以下代码:
TypeName myFunction()
{
TypeName result;
void * storage = malloc( sizeof( TypeName ) );
/*Magic code that stores a value in the space pointed to by storage*/
result = *(TypeName *)storage;
free( storage );
return result;
}
这会导致“HEAP CORRUPTION DETECTED”错误。如果我没有调用free()函数,则不会发生错误,但我担心我会创建内存泄漏。这将是正确的方法返回“存储”的值,然后释放内存?
答案 0 :(得分:3)
您不需要分配存储,您可以将结果变量传递给执行神奇功能的函数。这样的事情。
void magic(void *buffer)
{
// magic stuff
}
TypeName foo()
{
TypeName result;
magic(&result);
return result;
}
当然,您可以将TypeName结构设置为位字段或任何魔法代码操作...
答案 1 :(得分:2)
不要这样称呼它:
TypeName result;
void * storage = malloc( 4 );
你应该叫它
TypeName result;
void * storage = malloc( sizeof(TypeName) );
无论如何代码看起来很奇怪:)
答案 2 :(得分:1)
我认为你的困惑在于这一行:
void * storage = malloc( 4 );
看起来你正在尝试为4字节指针分配空间,但这不是你需要做的。让我们把这条线分成两步:
void * storage; // This allocates 4 bytes for a variable of type "pointer to void"
storage = malloc( 4 ); // This allocates 4 _more_ bytes and sets "storage" to their address.
我假设“魔术”代码将数据从Typename
类型的变量复制到为此storage
分配的内存中:
memcpy(storage, data_from_a_Typename_variable, sizeof(Typename));
因此,如果sizeof(Typename)
大于分配给storage
的4个字节,您将看到堆损坏错误。
正如其他答案所示,您需要做的是为Typename
变量分配足够的空间,如下所示:
void * storage = malloc(sizeof(Typename));
但是,正如Liz Albin建议的那样,您已经为Typename
中的result
分配了空间,因此将&result
或(void *) &result
传递给神奇的功能。
答案 3 :(得分:1)
怎么样:
TypeName myFunction() {
TypeName result;
void* storage = &result;
/*Magic code that stores a value in the space pointed to by storage*/
return result;
}
在这里,所有变量都将存储在堆栈中,因此您不应该遇到与堆相关的问题(取决于您的“神奇”代码究竟是什么)。
是否有理由将storage
数组与result
分开?如果将结果简单地复制到result
中,那么仅使用一个对象更有意义(恕我直言)(并且保持指向它的void*
指针或类型转换&result
为需要)。
如果有理由使用单独的storage
和result
,您可能会使用TypeName storage = new TypeName
和delete
代替malloc(4)
获得更好的上传free
。
答案 4 :(得分:0)
为什么malloc
有4个字节并且已经转换为类型名TypeName
?这绝对看起来很奇怪!
其他答案暗示你是什么......!
希望这有帮助, 最好的祝福, 汤姆。