2

在我的模板函数中,我有以下代码:

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;
}

这会导致“检测到堆损坏”错误。如果我不调用 free() 函数,则不会发生错误,但我担心我正在创建内存泄漏。返回的正确方法是什么“存储”的值,然后释放内存?

4

5 回答 5

3

你不需要分配存储空间,你可以将你的结果变量传递给一个函数来做你的魔法。像这样的东西。

void magic(void *buffer)
{
  // magic stuff 
}

TypeName foo()
{
   TypeName result;
   magic(&result);
   return result;
}

或者,当然你可以将你的 TypeName 结构设置为位域或任何你的魔法代码操作......

于 2010-03-03T17:34:27.503 回答
2

不要这样称呼它:

TypeName result;
void * storage = malloc( 4 );

你应该叫它

TypeName result;
void * storage = malloc( sizeof(TypeName) );

无论如何代码看起来很奇怪:)

于 2010-03-03T17:30:42.317 回答
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建议的那样,您已经为Typenamein分配了空间,result因此传递&result或传递(void *) &result给魔术函数更简单。

于 2010-03-03T17:51:59.527 回答
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

如果有理由使用单独的storageand result,使用TypeName storage = new TypeNameanddelete而不是malloc(4)and可能会获得更好的里程数free

于 2010-03-03T18:32:00.420 回答
0

为什么您malloc使用 4 个字节却又转换为 的类型名称TypeName?这绝对看起来很奇怪!

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

希望这会有所帮助,最好的问候,汤姆。

于 2010-03-03T17:36:33.193 回答