如何在C++中使数据所有权显式化

Dim*_* C. 14 c++

在C++中使用指针和引用时,有时很难看出指针是否对引用的数据具有所有权,或者它是否只是时间引用.例如:

Instance* i = new Instance();
Instance* j = i;
Run Code Online (Sandbox Code Playgroud)

如何弄清楚哪两个指针对实例拥有所有权?换句话说,如何明确必须调用哪个指针删除?

注意:在上面的例子中,这不难看出,因为它是一段很短的代码.但是,当指针被复制并传递很多时,这可能会变得不清楚.

Dan*_*ker 7

首先,使用引用来引用必须删除的数据似乎不必要地混淆.请改用指针.

其次,如果要指示对象的所有权,请使用管理所有权的包装类.有auto_ptr专门为此,尽管它也有缺点.(这些应该在下一版本的语言中由unique_ptr解决,但现在对你没有帮助).

第三,在最简单的情况下(尽可能经常),不要直接使用堆.只需声明一个本地对象,例如

std::vector<int> v;
Run Code Online (Sandbox Code Playgroud)

当您需要(使用swap)时,这并不会阻止您转移所有权.

  • 没有必要使用多态性的引用.指针工作得很好.如果你有一个对象的引用,就像说"无论你做什么,不要删除它!" 使用指针,它更容易被删除(尽管仍然需要了解设计/所有权). (4认同)

ral*_*nja 7

您无法确定所有者,因为没有内置机制来知道哪个指针拥有指针所指向的内存.

如果您真的关心这一点,您可以随时介绍自己的命名约定,例如通过对变量名称的一些前/后修复.换句话说,您的代码设计可以为您提供此信息.由于您(和您的同事)正在编写代码,因此您始终可以确保在实现过程中强制执行此设计.这当然意味着每个人都必须遵循这些"规则".

这是共同编码惯例如此重要的一个原因.因此,您可以阅读自己和其他人的代码并理解它.