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