*ptr 和 *ptr.get() 在使用 auto_ptr 时有什么区别?

What is the difference between *ptr and *ptr.get() when using auto_ptr?

为什么我要将 get()* 一起使用,而不只是调用 *

考虑以下代码:

auto_ptr<int> p (new int);
*p = 100;
cout << "p points to " << *p << '\n';           //100

auto_ptr<int> p (new int);
*p.get() = 100;
cout << "p points to " << *p.get() << '\n'; //100

结果完全一样。 get() 更安全吗?

没有有效差异。 operator* 定义为 return *get() (cppreference).

您应该考虑使用 unique_ptr 代替 auto_ptr。后者已从当前的 C++ 标准中删除,并且具有非常不直观的 yank-on-copy 行为。

几乎没有区别。

*p 的情况下,调用重载的 operator*(由 auto_ptr 定义)returns reference到底层对象(在取消引用它之后——这是由成员函数完成的)。但是,在后一种情况下,p.get() returns 您自己解除引用的底层指针。

我希望这能回答您的问题。现在我建议您 避免 使用 std::auto_ptr,因为它的设计很糟糕 — 它甚至已被弃用,优先于其他智能指针,例如 std::unique_ptrstd::shared_ptr(以及 std::weak_ptr)。

*p 调用 auto_ptr::operator*,取消引用托管指针。

*p.get 首先调用方法 auto_ptr::get,其中 returns 托管指针,然后由运算符 *.

解除引用

一旦执行这些将提供完全相同的结果:托管指针被取消引用,并且在使用 get 时不会进行额外检查。

请注意,自 C++11 起,auto_ptr 已弃用。这是危险的,因为指针的所有权在复制时转移:

std::auto_ptr<int> p(new int(42));

{
    std::auto_ptr<int> copy_of_p(p); // ownership of *p is transfered here
} // copy_of_p is destroyed, and deletes its owned pointer

// p is now a dangling pointer

为避免此问题,您必须 "manage the managed pointers":

std::auto_ptr<int> p(new int(42));

{
    std::auto_ptr<int> copy_of_p(p); // ownership of *p is transfered here

    // ...

    p = copy_of_p; // p gets back ownership
} // copy_of_p is destroyed, but doesn't delete pointer owned by p

// p is still valid

改用unique_ptr or shared_ptr

不要在智能指针上使用 get()(无论 auto_、unique_、shared_ 或其他)。 returns 一个不受 RAII class 控制的裸指针。这开辟了将指针指向另一个 RAII class(稍后导致双重删除)或调用者做一些愚蠢的事情,如删除指针(再次导致双重删除)的各种可能性。只需取消引用智能指针。

PS:仅供专家参考:是的,从智能指针中提取原始指针还有其他正当理由。但是一般不使用 get() ,它的使用次数成为 "there's something funky going on here, pay attention!".

的危险信号