释放分配给void指针数组的内存

时间:2008-10-15 20:19:19

标签: c++ c memory-management

我正在声明一个void指针数组。每个都指向一个任意类型的值    void **values; // Array of void pointers to each value of arbitary type

按如下方式初始化值:


    values = (void**)calloc(3,sizeof(void*));
    //can initialize values as: values = new void* [3];
    int ival = 1;
    float fval = 2.0;
    char* str = "word";
    values[0] = (void*)new int(ival);
    values[1] = (void*)new float(fval);
    values[2] = (void*)str;

    //Trying to Clear the memory allocated
    free(*values); 
    //Error: *** glibc detected *** simpleSQL: free(): invalid pointer: 0x080611b4
    //Core dumped
    delete[] values*;
    //warning: deleting 'void*' is undefined
    //Similar Error.

现在我如何释放/删除为值分配的内存(void指针数组)?

7 个答案:

答案 0 :(得分:7)

我怀疑问题与您分配values的方式有关:values = (void*)calloc(3,sizeof( void ))。这应该是sizeof(void *),而不仅仅是sizeof(void)

sizeof(void)可能是零或其他没有意义的东西,所以你并没有真正分配任何内存开始...这只是运气不好,分配工作,然后当你输出时错误弹出试着释放记忆。

编辑:你也在C ++风格new / delete与C风格的malloc / free之间交替提出问题。只要你没有delete某事malloc'或free某事new',就可以使用它们,但是你要去如果你这样的话,把它们混在脑袋里。

答案 1 :(得分:6)

你有3件动态分配的东西需要以两种不同的方式释放:

delete reinterpret_cast<int*>( values[0]);    
delete reinterpret_cast<float*>( values[1]);

free( values); // I'm not sure why this would have failed in your example, 
               //    but it would have leaked the 2 items that you allocated 
               //    with new

请注意,由于str未动态分配,因此不应释放(实际上不能)。

几点说明:

  • 我假设sizeof(void) 本来应该是sizeof(void*) 因为你有什么不会编译
  • 我不打算说什么 你看似随意的铸造除了 它看起来像准备好的代码 一般的灾难

答案 2 :(得分:4)

对于boost :: any class来说,这是完美的情况 您也可以考虑使用向量而不是分配自己的内存。

std::vector<boost::any>   data;
boost::any i1 = 1; // add integer
data.push_back(i1);

boost::any f1 = 1.0; // add double
data.push_back(f1);

data.push_back("PLOP"); // add a char *

std:: cout << boost::any_cast<int>(data[0]) + boost::any_cast<double>(data[1])
           << std::endl;

回到原始代码主要问题是:

values = (void*)calloc(3,sizeof(void));

// This should  have been
void** values = (void**)calloc(3,sizeof(void*));

// Freeing the members needs care as you need to cast them
// back to the correct type before you release the memory.

// now you can free the array with
free(values);

另请注意:虽然在同一段代码中同时使用new / delete和calloc / free并不违法,但不赞成。主要是因为很容易让事情混乱,这可能是致命的。

答案 3 :(得分:1)

你正在混合new和* alloc()。这是禁忌,并且可能导致不确定的结果。

答案 4 :(得分:0)

你必须跟踪最初调用多少void *,并迭代它们,释放每一个,然后释放原始值变量。

darn formatting ...(预览工作正常)。

int ct = 3;
values = (void*)calloc(ct,sizeof(void));
//can initialize values as: values = new void* [3];
int ival = 1;
float fval = 2.0;
char* str = "word";
values[0] = (void*)new int(ival);
values[1] = (void*)new float(fval);
values[2] = (void*)str;

for ( int i = 0; i < ct; i++ ) [
    delete( values[i] );
}
free( values );

答案 5 :(得分:0)

如果您正在使用C语言(在此处引用标记),我不确定您使用new的原因。

我会将我需要的数组中的各个部分进行malloc,然后在我完成时释放它们。你不能释放你没有首先使用malloc的东西。您也无法删除无效指针。

答案 6 :(得分:0)

请注意,您也没有删除值[0]和值[1]这是一个内存泄漏,但是根据您的设计,您不能释放值[2],因为它是指向您.data节的指针。 / p>