在C++中使用指针和引用时,有时很难看出指针是否对引用的数据具有所有权,或者它是否只是时间引用.例如:
Instance* i = new Instance();
Instance* j = i;
Run Code Online (Sandbox Code Playgroud)
如何弄清楚哪两个指针对实例拥有所有权?换句话说,如何明确必须调用哪个指针删除?
注意:在上面的例子中,这不难看出,因为它是一段很短的代码.但是,当指针被复制并传递很多时,这可能会变得不清楚.
首先,使用引用来引用必须删除的数据似乎不必要地混淆.请改用指针.
其次,如果要指示对象的所有权,请使用管理所有权的包装类.有auto_ptr专门为此,尽管它也有缺点.(这些应该在下一版本的语言中由unique_ptr解决,但现在对你没有帮助).
第三,在最简单的情况下(尽可能经常),不要直接使用堆.只需声明一个本地对象,例如
std::vector<int> v;
Run Code Online (Sandbox Code Playgroud)
当您需要(使用swap)时,这并不会阻止您转移所有权.
您无法确定所有者,因为没有内置机制来知道哪个指针拥有指针所指向的内存.
如果您真的关心这一点,您可以随时介绍自己的命名约定,例如通过对变量名称的一些前/后修复.换句话说,您的代码设计可以为您提供此信息.由于您(和您的同事)正在编写代码,因此您始终可以确保在实现过程中强制执行此设计.这当然意味着每个人都必须遵循这些"规则".
这是共同编码惯例如此重要的一个原因.因此,您可以阅读自己和其他人的代码并理解它.