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

我正在声明一个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指针数组)?

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

 delete reinterpret_cast( values[0]); delete reinterpret_cast( 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*)因为你所拥有的不会编译
  • 我不会对你看似随机的演员说什么,只不过它看起来像是一般的灾难准备好的代码

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

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

编辑:你也在C ++风格的new / delete与C风格的malloc / free之间交替问题。 可以使用它们,只要你不delete mallocfree东西,但是如果你这样的话,你会把它们混合起来。

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

 std::vector 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(data[0]) + boost::any_cast(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并不违法,但不赞成。 主要是因为很容易让事情变得混乱,这可能是致命的。

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

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

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

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

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

darn format …(预览工作正常)。

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