堆腐败问题

时间:2010-03-03 17:26:34

标签: c++ free malloc return-value

在我的模板功能中,我有以下代码:

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()函数,则不会发生错误,但我担心我会创建内存泄漏。这将是正确的方法返回“存储”的值,然后释放内存?

5 个答案:

答案 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为需要)。

如果有理由使用单独的storageresult,您可能会使用TypeName storage = new TypeNamedelete代替malloc(4)获得更好的上传free

答案 4 :(得分:0)

为什么malloc有4个字节并且已经转换为类型名TypeName?这绝对看起来很奇怪!

其他答案暗示你是什么......!

希望这有帮助, 最好的祝福, 汤姆。