>백엔드 개발 >C++ >C에서 포인터 벡터로 메모리 누수를 방지하는 방법은 무엇입니까?

C에서 포인터 벡터로 메모리 누수를 방지하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-19 16:31:031010검색

How to Avoid Memory Leaks with Vectors of Pointers in C  ?

C에서 포인터 벡터를 사용하여 메모리 누수 방지

동적 메모리 할당 작업 시 메모리 누수를 방지하는 것이 중요합니다. 일반적인 시나리오 중 하나는 기본 클래스에서 파생된 객체에 대한 포인터 벡터를 사용하는 것입니다.

포인터 벡터 및 메모리 관리

std::Vector는 포인터에 대한 메모리를 관리하지만 객체는 관리하지 않습니다. 그들 자신. 이는 벡터의 push_back() 메소드를 통해 할당된 객체가 벡터가 범위를 벗어나도 자동으로 삭제되지 않음을 의미합니다.

메모리 누수 방지

1. 수동 개체 삭제:

이 접근 방식을 사용하려면 아래 코드에 설명된 것처럼 벡터가 범위를 벗어나기 전에 각 개체를 수동으로 삭제해야 합니다.

#include <vector>

struct base {
    virtual ~base() {}
};

struct derived : base {};

typedef std::vector<base*> container;

void foo() {
    container c;

    for (unsigned i = 0; i < 100; ++i)
        c.push_back(new derived());

    // Manual object deletion
    for (auto& obj : c)
        delete obj;
}

2. 스마트 포인터:

대안은 자동 메모리 관리 기능을 제공하는 스마트 포인터를 사용하는 것입니다. std::unique_ptr 및 std::shared_ptr은 일반적으로 사용되는 스마트 포인터입니다.

std::unique_ptr:

unique_ptr은 리소스의 단독 소유권을 나타냅니다. 객체가 범위를 벗어나면 자동으로 삭제합니다.

#include <vector>
#include <memory>

struct base {
    virtual ~base() {}
};

struct derived : base {};

typedef std::vector<std::unique_ptr<base>> container;

void foo() {
    container c;

    for (unsigned i = 0; i < 100; ++i)
        c.push_back(std::make_unique<derived>());
}

std::shared_ptr:

shared_ptr을 사용하면 여러 소유자가 리소스를 공유할 수 있습니다. 소유자 수를 추적하고 참조 횟수가 0이 되면 객체를 삭제합니다.

#include <vector>
#include <memory>

struct base {
    virtual ~base() {}
};

struct derived : base {};

typedef std::vector<std::shared_ptr<base>> container;

void foo() {
    container c;

    for (unsigned i = 0; i < 100; ++i)
        c.push_back(std::make_shared<derived>());
}

3. Boost::ptr_container:

Boost::ptr_container::ptr_Vector는 포인터를 보유하고 파기 시 자동으로 삭제하도록 설계된 특수 컨테이너입니다.

#include <boost/ptr_container/ptr_vector.hpp>

struct base {
    virtual ~base() {}
};

struct derived : base {};

typedef boost::ptr_vector<base> container;

void foo() {
    container c;

    for (int i = 0; i < 100; ++i)
        c.push_back(new Derived());
}

일반적으로 권장된다는 점을 기억하세요. 자동적이고 예외로부터 안전한 메모리 관리를 제공하는 스마트 포인터(특히 std::unique_ptr)를 사용합니다. 수동 객체 삭제를 피하고 코드에서 메모리 누수 및 예측할 수 없는 동작을 방지하기 위해 더 이상 필요하지 않을 때 항상 리소스 할당이 취소되도록 하세요.

위 내용은 C에서 포인터 벡터로 메모리 누수를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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