1

假设我有一个 C 程序,它调用一些用 C++ 编写的代码。为了使它更具体一点,这可能类似于以下内容:

// C++:
extern "C" void * pluginFunction(void * input) {
    result = (SomeObject *) input;
    if (! result)
        SomeObject * result = new SomeObject();

    // Do something really intelligent here.
    return (void*) result;
}

对于调用 C 程序:

int main() {
    void * result;
    while (something) {
        result = pluginFunction(result);
        // some more things
    }

    // Cleanup memory
}

此外,假设 C 程序提供自定义内存管理。因此,C 程序总是知道使用提供的函数 和custom_alloc分配了哪些内存。custom_freecustom_realloc

在 C++ 端,运算符、new和已在标准和版本中全局重载。new[]deletedelete[]throw ()

现在我的问题:

  • 如果 C 部分在调用 期间释放通过自定义函数分配的所有内存pluginFunction,它会释放所有实际分配的内存,还是有比 的变体提供的内存更多的东西new
  • 绕过对适当析构函数的调用会造成什么进一步的伤害?是否可以在 C++ 方面完全避免这种伤害,例如在pluginFunction?
  • 您是否看到任何潜在的陷阱或副作用?

请注意,我无法访问调用 C 程序,但必须使用提供的接口。因此,我没有其他选择来安排我的记忆,让它得到适当的释放并希望最好。

4

2 回答 2

1

规则很简单:你必须销毁你分配的内存。所以你的插件接口必须同时提供分配和解除分配功能。

于 2013-03-05T06:35:24.323 回答
1
  1. C++ 函数还可以调用 malloc() 或任何其他可能调用 malloc() 的标准 C 库,因此覆盖 new 和 delete 可能还不够。您还需要覆盖 malloc、calloc 等。

  2. C++ 代码可能会执行一些其他需要在析构函数中取消初始化的初始化,例如打开硬件、套接字、文件等。所以是的,可能会有副作用。

  3. 见 2。

于 2013-03-05T07:03:06.747 回答