c/c++语言开发共享释放分配给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不是动态分配的,因此不应该(实际上不能 )释放它。

    几个笔记:

    我怀疑问题在于您分配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 ); 

      以上就是c/c++开发分享释放分配给void指针数组的内存相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/544858.html

      (0)
      上一篇 2021年1月9日
      下一篇 2021年1月9日

      精彩推荐