>  기사  >  백엔드 개발  >  C++ 스마트 포인터: 포인터의 진화, 메모리 문제에 대한 좋은 솔루션

C++ 스마트 포인터: 포인터의 진화, 메모리 문제에 대한 좋은 솔루션

WBOY
WBOY원래의
2024-05-09 11:09:02355검색

스마트 포인터는 메모리 릴리스를 자동으로 관리하여 메모리 관리 문제를 해결하는 C++ 도구입니다. 일반적으로 사용되는 스마트 포인터 유형은 다음과 같습니다: Unique_ptr: 독점 소유권, 소멸 시 지적 객체를 해제합니다. shared_ptr: 공유 소유권, 참조 계산은 포인터 수를 추적하고 마지막 포인터가 소멸되면 객체가 해제됩니다. weak_ptr: 약한 참조는 객체 수명주기를 늘리지 않으며 shared_ptr과 조합해서만 사용할 수 있습니다.

C++ 智能指针:指针的进化,解决内存问题的良药

C++ 스마트 포인터: 포인터의 진화, 메모리 문제에 대한 좋은 솔루션

스마트 포인터는 메모리 릴리스를 자동으로 관리하여 메모리 누수 및 와일드 포인터와 같은 문제를 해결하는 데 도움이 되는 C++의 강력한 도구입니다. 기존 포인터에 비해 스마트 포인터는 더 안전하고 효율적이므로 프로그래머는 지루한 메모리 관리 세부 사항에 대해 걱정하지 않고 비즈니스 로직 작성에 집중할 수 있습니다.

여러 공통 스마트 포인터

unique_ptr

  • 독점 소유권, 단 하나의 개체만 가리킵니다.
  • unique_ptr이 소멸되면 그것이 가리키는 객체도 소멸됩니다.

shared_ptr

  • 공유 소유권을 통해 여러 개체가 동일한 메모리 블록을 가리킬 수 있습니다.
  • 참조 카운트는 포인터 수를 추적합니다. 마지막 shared_ptr이 삭제되면 가리키는 개체도 삭제됩니다.

weak_ptr

  • 약한 참조는 지적 객체의 수명 주기를 늘리지 않습니다.
  • shared_ptr과 함께만 사용할 수 있습니다. 마지막 shared_ptr이 삭제되면 약한_ptr이 무효화됩니다.

실용 사례

사람을 나타내는 Person 클래스가 있다고 가정해 보겠습니다. 우리의 목표는 Person 개체를 저장하는 벡터를 만들고 벡터가 범위를 벗어날 때 메모리가 자동으로 해제되도록 하는 것입니다. Person 类,它表示一个人。我们的目标是创建一个存储 Person 对象的向量,并确保当向量超出了作用域时,内存会被自动释放。

#include <iostream>
#include <vector>
#include <memory>

class Person {
public:
    Person(const std::string& name) : name(name) {}
    ~Person() { std::cout << "Destructor called for " << name << std::endl; }

private:
    std::string name;
};

int main() {
    std::vector<std::shared_ptr<Person>> people;

    // 添加几个 Person 对象
    people.push_back(std::make_shared<Person>("John"));
    people.push_back(std::make_shared<Person>("Mary"));
    people.push_back(std::make_shared<Person>("Bob"));

    // 遍历并打印名称
    for (const auto& person : people) {
        std::cout << person->name << std::endl;
    }

    return 0;
}

输出:

John
Mary
Bob
Destructor called for John
Destructor called for Mary
Destructor called for Bob

在示例中,我们使用 std::shared_ptr8abf60ac54173a2785e603c7a1f95b4e 来存储 Person 对象的指针。当 people 向量超出作用域销毁时,智能指针也会随之销毁。这将自动释放 Personrrreee

출력: 🎜rrreee🎜예제에서는 std::shared_ptr8abf60ac54173a2785e603c7a1f95b4e을 사용하여 Person 개체의 포인터를 저장합니다. people 벡터가 범위 밖에서 소멸되면 스마트 포인터도 소멸됩니다. 이렇게 하면 Person 개체가 차지하는 메모리가 자동으로 해제되고 메모리 누수를 방지할 수 있습니다. 🎜

위 내용은 C++ 스마트 포인터: 포인터의 진화, 메모리 문제에 대한 좋은 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.