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