C++中的内存管理的一个方面是目前困扰着我。 C++中用于内存管理的主要概念是所有权。每个对象都由一个或(通过共享指针)拥有多个事物。这些东西可以是其他对象或范围/块。所有权可以转让(通过独特的指针)。一旦事物(对象,范围/块)不复存在,它就会放弃它所拥有的所有权,并且所有没有其他所有者的对象也不再存在。如何有效处理需要所有权的临时帮手?
关于API的,一个有表达如果取得所有权对象或不:
- 以独占所有权由通过值或右值引用采取什么表示。
- 通过使用共享指针来表达共享所有权。
- 未采用所有权通过使用左值引用来表示。
这工作得非常好在大多数情况下,但我有麻烦一种情况:我有一个并不需要采取所有权的功能,但它使用的是仅仅是作为参考临时器辅助对象一些其他的对象,即他们有成员是指针或引用。如果我想避免悬而未决的引用,这基本上意味着辅助对象需要对它们引用的对象声明共享所有权。现在,我有两种选择:
- 修改函数采取共享所有权指针,但然后,它泄漏实现细节。基本上,所有函数的所有参数都是这种类型的......就像他们在大多数垃圾收集或引用计数语言中一样。
- 在我的助手类中使用引用/原始指针来表示共享所有权,并依赖用户确保在共享资源之前销毁助手类实例。
对于何时做出哪一个决定,我目前没有明确的指导方针,大多数情况下我倾向于使用后一种方法。但是现在,我介绍了一个不容易找到它并花费我一些时间的错误。
我想了解如何在未来避免这些情况。在调试过程中,我编写了一些能够检测到这种情况的代码(通过使用可在生产模式下停用的引用计数)(但将它用于错误的对象;-))。
这似乎是一个合理的做法,但会在这条道路之前,我想找到一些东西出来:
- 这真的是一个合理的方法或者是有什么错我设计的API的方式为我的软件?
- 标准库中是否有任何我不知道的事情使得这个任务变得简单?
- 或任何第三方库?
添加的澄清代码示例:
struct AutoAddEndLineAdaptor
{
template <class T>
AutoAddEndLineAdaptor &
operator<<(T && t)
{
_out << std::forward<T>(t) << std::endl;
return * this;
}
std::ostream & _out;
};
void printStuff(std::ostream & out) {
AutoAddEndLineAdaptor{ out } << "Hello" << "World";
}
auto breakStuff(std::string file) {
std::ofstream o(file);
return AutoAddEndLineAdaptor(o);
}
的类需要共享所有权成为安全的,即在breakStuff
难以使用,但printStuff
不。
你可以添加代码示例吗? –
[标签:Rust]在其类型系统中有生命时间来完全处理这些情况。 – Jarod42
“*如果我想避免悬挂引用,这基本上意味着辅助对象需要对它们引用的对象声明共享所有权。*”如果这是真的,如果它们确实是临时对象,那么它们不需要声称拥有这些物品的所有权他们只是参考它们。 –