linux

C++在Linux下的智能指针如何使用

小樊
34
2025-05-12 09:17:08
栏目: 编程语言

在 Linux 下使用 C++ 的智能指针,首先需要了解 C++11 标准库中提供的几种智能指针类型。这些智能指针可以自动管理内存资源,帮助避免内存泄漏。以下是 C++11 中最常用的智能指针:

  1. std::unique_ptr:独占资源所有权的智能指针。它确保同一时间只有一个 unique_ptr 指向给定的对象。当 unique_ptr 被销毁时,它所指向的对象也会被自动删除。
#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructor" << std::endl; }
    ~MyClass() { std::cout << "MyClass destructor" << std::endl; }
};

int main() {
    std::unique_ptr<MyClass> ptr(new MyClass());
    // 使用 ptr
} // 当 ptr 离开作用域时,MyClass 对象会被自动删除
  1. std::shared_ptr:共享资源所有权的智能指针。多个 shared_ptr 可以指向同一个对象,通过引用计数来跟踪有多少个 shared_ptr 指向该对象。当最后一个指向对象的 shared_ptr 被销毁时,对象会被自动删除。
#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructor" << std::endl; }
    ~MyClass() { std::cout << "MyClass destructor" << std::endl; }
};

int main() {
    std::shared_ptr<MyClass> ptr1(new MyClass());
    {
        std::shared_ptr<MyClass> ptr2 = ptr1;
        // 使用 ptr1 和 ptr2
    } // 当 ptr2 离开作用域时,引用计数减一,但 MyClass 对象不会被删除,因为 ptr1 仍然指向它
} // 当 ptr1 离开作用域时,引用计数变为零,MyClass 对象被自动删除
  1. std::weak_ptr:弱引用智能指针,用于解决 shared_ptr 的循环引用问题。weak_ptr 不会增加引用计数,因此不会影响对象的生命周期。要访问 weak_ptr 指向的对象,需要将其转换为 shared_ptr
#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructor" << std::endl; }
    ~MyClass() { std::cout << "MyClass destructor" << std::endl; }
};

int main() {
    std::shared_ptr<MyClass> sharedPtr(new MyClass());
    std::weak_ptr<MyClass> weakPtr = sharedPtr;

    // 使用 sharedPtr
    if (auto lockedPtr = weakPtr.lock()) {
        // 使用 lockedPtr 访问 MyClass 对象
    }
} // 当 sharedPtr 离开作用域时,MyClass 对象被自动删除

在 Linux 下使用这些智能指针时,请确保你的编译器支持 C++11 或更高版本,并在编译时启用相应的选项(例如,使用 -std=c++11-std=c++14)。

0
看了该问题的人还看了