📌  相关文章
📜  auto_ptr,unique_ptr,shared_ptr和weak_ptr(1)

📅  最后修改于: 2023-12-03 15:29:32.165000             🧑  作者: Mango

C++ 智能指针

在 C++ 中,智能指针是一种模板类,用于管理动态分配的对象的内存,并防止内存泄漏。C++ 标准库提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。

auto_ptr

auto_ptr 是 C++ 98 中引入的第一种智能指针。auto_ptr 是一个独占所有权的智能指针,它允许在创建对象时指定指针类型,自动释放指针所指向的内存。auto_ptr 已经在 C++ 11 中被废弃,并在 C++17 中被移除。

auto_ptr 的使用示例:

#include <iostream>
#include <memory>

int main()
{
    std::auto_ptr<int> p(new int(5));
    std::cout << *p << std::endl;
    return 0;
}
unique_ptr

unique_ptr 是 C++ 11 中引入的另一种智能指针。 unique_ptr 是一个独占所有权的智能指针,它通过提供移动语义来解决 auto_ptr 的问题。 unique_ptr 只能有一个所有者,不能复制,但可以移动。当 unique_ptr 被销毁时,它所拥有的对象也随之销毁。

unique_ptr 的使用示例:

#include <iostream>
#include <memory>

int main()
{
    std::unique_ptr<int> p(new int(5));
    std::cout << *p << std::endl;
    return 0;
}
shared_ptr

shared_ptr 是 C++ 11 中引入的第三种智能指针。shared_ptr 允许多个智能指针共享同一个对象,并在最后一个引用被销毁时自动销毁对象。shared_ptr 使用计数器来跟踪指向对象的引用次数,并在引用计数为 0 时释放内存。

shared_ptr 的使用示例:

#include <iostream>
#include <memory>

int main()
{
    std::shared_ptr<int> p1(new int(5));
    std::shared_ptr<int> p2(p1);
    std::cout << *p1 << " " << *p2 << std::endl;
    return 0;
}
weak_ptr

weak_ptr 是 C++ 11 中引入的第四种智能指针,它是一种用户管理共享对象的安全方式。weak_ptr 可以安全地指向 shared_ptr 所共享的对象,而不增加引用计数,因此不会阻止对象被销毁。

weak_ptr 的使用示例:

#include <iostream>
#include <memory>

int main()
{
    std::shared_ptr<int> p1(new int(5));
    std::weak_ptr<int> p2(p1);
    std::cout << p2.expired() << std::endl;
    p1.reset();
    std::cout << p2.expired() << std::endl;
    return 0;
}

以上是 C++ 中四种常见的智能指针,每种智能指针都有其特定的用途,开发人员可以根据实际情况选择使用合适的智能指针。