c++中按值传递时的复制顺序
Sequencing of the copying when passing by value in C++
在c++中,当按值传递对象时,是否对何时进行复制有限制?
我有以下代码(简化):
class A;
class Parent
{
public:
void doSomething(std::auto_ptr<A> a); // meant to transfer ownership.
};
std::auto_ptr<A> a = ...;
a->getParent()->doSomething(a);
作用如下:
std::auto_ptr<A> a = ...;
std::auto_ptr<A> copy(a);
a->getParent()->doSomething(copy);
这显然会导致段错误,因为a
现在引用NULL
。
而不是:
std::auto_ptr<A> a = ...;
Parent* p = a->getParent();
p->doSomething(a);
A: auto_ptr在较新的c++版本中已弃用,我建议检查unique_ptr。
B:这种行为是预料之中的。auto_ptr对象拥有它所创建的对象。因此,如果您希望正确地将所有权从一个auto_ptr转移到另一个auto_ptr,则原始auto_ptrs托管对象将正确地为空指针。虽然我相信这个逻辑是由std::auto_ptr库处理的,您不应该做任何特殊的事情来获得这个行为。如果允许两个auto_ptrs管理同一个对象,那么当它们超出作用域时,它们也会尝试释放该对象的内存。这本身就很糟糕,但更糟糕的是,如果其中一个auto_ptr有更大的作用域,它可能会试图引用不再保存该对象的内存,因为它已经被另一个auto_ptr释放了,在这种情况下,我们会遇到真正的混乱。因此,当所有权转移时,原始指针托管对象被设置为null,我们就有了安全的错觉。:)
在我看来,这个例子并不好,至少有三个原因。
1)在没有看到doSomething原型的情况下查看代码,不清楚所有权是否可以改变。
2)如果结果可能取决于求值的顺序,那么代码是不可移植的或依赖于实现的,因此是不可接受的。
3)即使求值顺序是正确的,代码也可以从其他代码中提出这个确切的问题开发者会浪费他们的时间。可读性必须是最高优先级。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- CMake-按正确顺序将项目与C运行时对象文件链接
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 函数调用中参数的顺序重要吗
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 数到第n个楼梯的路(顺序无关紧要)
- 优先顺序:智能指针和类析构函数
- 保留从一个多集复制到另一个多集的元素的顺序
- 如何以相反的顺序将整个向量复制到队列中
- 在不复制数据的情况下更改 opencv mat 中的列顺序
- 构造函数和复制构造函数的顺序
- 以相反的顺序将一个向量复制到另一个向量
- c++中按值传递时的复制顺序
- 在另一个文件中以相反的顺序复制字符串和整数文件