我有一个实现二进制兼容接口(用作共享库)的 C++ 类,因此只返回 C 类型。字符串作为 const char*、void 指针和指向具有二进制兼容接口的其他类的指针。问题是我应该如何组织内存管理,我应该返回指向现有类数据的常量指针(用户使用过时指针的危险),然后我自己释放内存,或者更确切地说是指向一些堆变量的指针并让用户负责删除这些指针以后,还是???有没有一些通用的指导方针?
7 回答
在“二进制兼容接口”中,使用 C 接口,您不会假设共享堆。因此,从堆分配内存的一方是将内存返回到该堆的一方。
如果你从一个堆中分配一个块,将它传递给一个 C 接口,然后将delete
它放在另一端,你可能会遇到严重的失败和/或静默损坏。
让调用者负责分配和释放内存。
两者都被接受并在生产环境中使用,只要它们被清晰而完整地记录在案。
这真的取决于你。
一个好的面向对象的方法是让类自己管理内存。OOP 的大部分好处是尽可能地封装功能。所以你可以设计它,这样代码可以调用你的类方法,而不用担心内存是如何分配或释放的,因为它是由类管理的。
但是,有时这种方法不起作用,因为类没有好方法知道何时不再需要内存。对于这些情况,您可以让调用者分配内存(然后释放它),或者简单地规定调用者必须释放从类中分配和返回的内存。
它是双向的。这里没有任何硬性规定。
如果可能,请使用诸如 unique_ptr 或 shared_ptr 之类的智能指针。(这应该没问题,因为你已经包装了 C 函数,如果我没听错的话。)
我会说调用者有责任释放数据。另请注意,new
如果调用者不是 C++ 应用程序,则不能使用。
如果您正在写入现有 API,那么您可以执行该 API 需要的任何操作。在这件事上你别无选择;API 已指定谁负责什么,并且 API 另一端的代码将期望您的实现符合。