我正在声明一个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
不是动态分配的,因此不应该(实际上不能 )释放它。
几个笔记:
我怀疑问题在于您分配values
的方式: values = (void*)calloc(3,sizeof(
void
))
。 那应该是sizeof(void *)
而不仅仅是sizeof(void)
。
sizeof(void)可能是零或其他没有意义的东西,所以你并没有真正分配任何内存开始……这只是运气不好,分配工作,然后当你试图解除分配时弹出错误记忆。
编辑:你也在C ++风格的new
/ delete
与C风格的malloc
/ free
之间交替问题。 可以使用它们,只要你不delete
malloc
或free
东西,但是如果你这样的话,你会把它们混合起来。
这是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 );
以上就是c/c++开发分享释放分配给void指针数组的内存相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544858.html