*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_ptr
和 std::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!".
的危险信号
为什么我要将 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_ptr
和 std::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!".
的危险信号