C ++库免费指针

时间:2014-06-28 15:14:46

标签: c++ pointers c++11

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

为了使这个问题更加通用,我想知道我应该用库的用户提供的指针做什么。我该怎么办?我在想列表中的一点:

  1. 释放所有指针,并注意不必再释放给予该类的指针(这看起来很奇怪且反直觉,因为新的与完全不同的设置中的删除相匹配)
  2. 维护用户提供的指针列表,只需跳过该列表中的任何指针(可能不是真正的解决方案,因为每次都必须检查整个列表)
  3. 只有类可以创建事件,因此用户不能使用new关键字创建指针,只能让处理类分配它们。
  4. 强制使用共享指针并在我的代码中专门使用它们,这样当它们超出范围时它们将自动释放。
  5. 维护一个自己的指针列表,只释放它们,让用户指定的指针超出范围/他们必须自己清理它们。
  6. ...? (我可能没想过的东西?)
  7. 那么请告诉我这种情况下的习惯是什么,其中库的用户提供了指针,这些指针被添加到由您维护的列表中,然后列表超出范围,而您有自己的指针混合与他们的。

    提前致谢!

1 个答案:

答案 0 :(得分:2)

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

我的第一个建议是避免完全动态分配对象。您是否可以存储std::vector<Event>并按值将Event传递给您的图书馆?然后用户可以愉快地不关心对象的所有权,但是如果他们愿意,他们可以选择动态分配它们。

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

std::unique_ptr<Object> createObject();

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