3

我正在声明一个 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.

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

4

7 回答 7

7

我怀疑问题出在您分配的方式上values:。那应该不仅仅是.values = (void*)calloc(3,sizeof(void))sizeof(void *)sizeof(void)

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

编辑:您还通过在 C++ 风格new/delete与 C 风格malloc/之间交替来寻找麻烦free。可以同时使用它们,只要你不使用delete你编辑的东西mallocfree你编辑的东西new,但如果你这样做,你会在脑海中混淆它们。

于 2008-10-15T20:28:19.780 回答
6

您有 3 个动态分配的东西需要以 2 种不同的方式释放:

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*) 因为你不会编译
  • 我不会说任何关于你看似随机的铸造的事情,只是它看起来像是准备好迎接灾难的代码
于 2008-10-15T20:29:35.503 回答
4

这是 boost::any 类的完美情况
此外,您可能需要考虑使用向量而不是分配自己的内存。

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 并不违法,但这是不受欢迎的。主要是因为很容易把事情搞混,这可能是致命的。

于 2008-10-15T21:09:18.700 回答
1

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

于 2008-10-15T20:45:14.957 回答
0

您必须跟踪最初 calloc'd 的 void* 数量,并遍历它们,释放每个,然后释放原始值变量。

该死的格式...(预览工作正常)。

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 );
于 2008-10-15T20:25:29.083 回答
0

如果您在 C 中做事(在此处引用标签),我不确定您为什么要使用 new。

我会 malloc 我需要的数组的各个部分,然后我想在完成后释放它们。你不能释放你没有首先 malloc 的东西。您也不能删除 void 指针。

于 2008-10-15T20:28:00.513 回答
0

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

于 2008-10-15T20:49:18.710 回答