繁体   English   中英

C ++库免费指针

[英]C++ Library free pointer

我正在创建一个简单的C ++ MIDI库,但遇到一个小问题。 目前,除了读取文件之外,我已经实现了所有其他功能。 在内部,我有一个std::vector带有事件的动态分配的原始指针(带有new()关键字),该事件是抽象类,因此无法实例化。 现在,我终于开始阅读了,这里有一个小问题。 我将不得不自己分配对象,然后再释放它们。 但是,这会产生问题,因为库的用户可能会在事件之间包含事件或将事件附加到事件之后。 这将意味着在我的std::vector其他位置创建了动态指针,这使得释放一个困难的问题成为可能。

为了使这个问题更笼统,我想知道应该如何使用库用户提供的指针。 我该怎么办? 我在想清单上的要点之一:

  1. 释放所有指针,并注意不必再释放给予该类的指针(这看起来很奇怪且违反直觉,因为在完全不同的设置中,新指针与删除指针匹配)
  2. 维护用户提供的指针列表,并仅跳过该列表中的任何指针(可能不是真正的解决方案,因为每次都必须检查整个列表)
  3. 使事件的创建仅适用于该类,因此用户无法使用new关键字创建指针,而只能通过让处理类分配它们来创建指针。
  4. 强制使用共享指针,并在我的代码中专门使用它们,以便当它们超出范围时将自动释放它们。
  5. 维护自己的指针列表并仅释放它们,并让给定指针的用户超出范围/他们将必须自己清理它们。
  6. ...? (我可能没有想到的事情?)

因此,请告诉我在这种情况下的惯例,在这种情况下,库的用户提供了指针,该指针被添加到您维护的列表中,然后该列表超出范围,而您将自己的指针与其混合在一起。

提前致谢!

选择一致的政策。 不要选择任何导致您必须销毁某些地方的某些对象和其他地方的其他对象的选项。 尤其不是那些由用户负责破坏某些对象的方法,而不是由其他负责的方法。 所有权应统一处理。

我的第一个建议是避免完全动态分配对象。 您是否不能存储std::vector<Event>并按值将Event传递给您的库? 这样,用户可以很高兴地不在乎对象的所有权,但是他们可以根据需要选择动态分配对象。

如果确实需要动态分配对象,建议您始终将它们包装在智能指针中,以便自动管理所有权。 例如,如果要代表用户分配一些对象,则其标准接口如下所示:

std::unique_ptr<Object> createObject();

另一方面,如果您的库具有需要与用户共享的一些内部动态分配,则返回std::shared_ptr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM