1

在 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);

这是预期的吗?

4

2 回答 2

0

答:auto_ptr 在较新版本的 C++ 中已被弃用,我建议查看 unique_ptr。

B:这种行为是意料之中的。auto_ptr 拥有它所创建的东西。因此,如果您希望将所有权从一个 auto_ptr 正确转移到另一个,则原始 auto_ptrs 托管对象将正确地是一个空指针。虽然我相信这个逻辑是由 std::auto_ptr 库处理的,你不应该做任何特别的事情来获得这种行为。如果允许两个 auto_ptr 管理同一个对象,那么当它们超出范围时,它们也会尝试释放该对象的内存。这本身就很糟糕,但更糟糕的是,如果这些 auto_ptr 中的一个具有更广泛的范围,它可能会尝试引用不再保存有问题的对象的内存,因为它已经被另一个 auto_ptr 释放了,在这我们有 true混乱。因此,当所有权转移时,原来的指针托管对象被设置为null,我们就有了安全的错觉。:)

于 2013-05-22T04:05:54.070 回答
0

在我看来,这个例子不好,至少有三个原因。

1) 在没有看到 doSomething 原型的情况下查看代码,不清楚所有权是否可以更改。

2)如果结果可能取决于评估顺序,则代码不可移植或不依赖于实现,因此不可接受。

3)即使评估顺序正确,代码也会向其他开发人员提出这个确切的问题,并且会浪费他们的时间。可读性必须是最高优先级。

于 2013-05-22T07:22:38.237 回答