我正在创建一个简单的C ++ MIDI库,我遇到了一个小问题。目前,我已经实现了除文件读取之外的所有内容。在内部,我有一个std::vector
带有原始的,动态分配的指针(带有new()
关键字)的事件,这是一个抽象类,因此无法实例化。现在我终于开始阅读部分了,有一个小问题。我将不得不自己分配对象,然后将它们释放出来。但这会产生问题,因为库的用户可能在其中包含事件或附加事件。这意味着我的std::vector
中的其他地方已经创建了动态指针,这使得解决了一个棘手的问题。
为了使这个问题更加通用,我想知道我应该用库的用户提供的指针做什么。我该怎么办?我在想列表中的一点:
那么请告诉我这种情况下的习惯是什么,其中库的用户提供了指针,这些指针被添加到由您维护的列表中,然后列表超出范围,而您有自己的指针混合与他们的。
提前致谢!
答案 0 :(得分:2)
选择一致的政策。不要选择导致您必须销毁某些地方的某些物体和其他地方的其他物体的任何选项。特别是那些用户负责销毁某些对象而不是其他对象的方法。所有权应统一处理。
我的第一个建议是避免完全动态分配对象。您是否可以存储std::vector<Event>
并按值将Event
传递给您的图书馆?然后用户可以愉快地不关心对象的所有权,但是如果他们愿意,他们可以选择动态分配它们。
如果您确实需要动态分配对象,我建议您始终将它们包装在智能指针中,以便自动管理所有权。例如,如果您代表用户分配某个对象,则标准接口类似于:
std::unique_ptr<Object> createObject();
另一方面,如果您的库有一些内部动态分配,需要与用户共享,请返回std::shared_ptr
。