如何释放使用C++"new"运算符分配的C中的内存

Chr*_*aes 1 c c++ malloc free new-operator

我使用C编写的一些函数创建自己的C/C++库; 其他用C++编写.在库内我使用new运算符:

mystruct * mystruct_alloc()
    {
    mystruct * ms = new mystruct;
    return ms;
    }
Run Code Online (Sandbox Code Playgroud)

现在我在C中使用这个库,如下所示:

mystruct *ms = mystruct_alloc();
// do stuff
free(ms);
Run Code Online (Sandbox Code Playgroud)

当我用valgrind检查时; 我收到这样的警告:

Mismatched free() / delete / delete []
Run Code Online (Sandbox Code Playgroud)

但我的印象是所有内存都正确释放.我知道有两种方法可以避免这个问题.

我可以重写我的C++代码来使用malloc:

mystruct * mystruct_alloc()
    {
    mystruct * ms = (mystruct *) malloc (sizeof(mystruct));
    return ms;
    }
Run Code Online (Sandbox Code Playgroud)

我可以dealloc在我的库中编写一个函数:

void mystruct_dealloc(mystruct *ms)
    {
    delete ms;
    }
Run Code Online (Sandbox Code Playgroud)

我不会再有问题; 但最好的方法是什么?new更容易使用; 但它在valgrind中给出了那些警告.所以这是我的问题:

  1. 如果我使用new和所有内存都正确释放free?(所以valgrind警告不是很重要)
  2. 有没有一种首选的方法来编程?

Arn*_*rtz 9

  1. 它不能保证正确释放,但它可能会取决于编译器和运行时库.
  2. 总是应该以相应的方式返回内存:

    • free 对于 malloc
    • 原料delete原料new
    • 为定义operator delete的用户定义的用户operator new
    • 如果您的存储由某些DLL提供,请将其返回到该DLL以进行正确的解除分配
    • 如果你切开一只恐龙的腹部以获得你的存储,将记忆恢复到同一个恐龙的腹部并再用几针缝合它.

在您的情况下,编写并调用C++库中的相应函数:

void mystruct_free(mystruct* ms)
{
  delete ms;
}
Run Code Online (Sandbox Code Playgroud)