동적 메모리 할당 작업 시 메모리 누수를 방지하는 것이 중요합니다. 일반적인 시나리오 중 하나는 기본 클래스에서 파생된 객체에 대한 포인터 벡터를 사용하는 것입니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!