>백엔드 개발 >C++ >C++의 스마트 포인터 살펴보기

C++의 스마트 포인터 살펴보기

王林
王林원래의
2023-08-22 15:57:29631검색

C++의 스마트 포인터 살펴보기

스마트 포인터는 C++에서 매우 중요한 개념입니다. 그 역할은 프로그래머가 메모리 누수를 방지하는 동시에 보다 편리하고 유연한 메모리 관리 방법을 제공하는 것입니다. 이 기사에서는 스마트 포인터의 개념, 유형 및 사용법을 자세히 살펴보겠습니다.

  1. 스마트 포인터의 개념

스마트 포인터는 메모리 할당을 캡슐화하고 스마트 포인터 개체에 해제하는 포인터를 저장하는 최신 C++ 메모리 관리 기술입니다. C++ 언어는 프로그래머를 위해 메모리를 자동으로 관리하지 않고 프로그래머가 메모리 해제를 잊어버리는 경우가 많기 때문에 스마트 포인터를 사용하면 이러한 문제가 발생할 가능성을 크게 줄일 수 있습니다.

스마트 포인터의 또 다른 장점은 메모리 릴리스 및 개체 수명 주기 관리를 프로그래머가 아닌 스마트 포인터 라이브러리로 이동하므로 프로그램의 유지 관리 가능성을 향상시킬 수 있다는 것입니다. 최신 C++에서 스마트 포인터를 사용하는 코드는 원시 포인터를 사용하는 코드보다 더 강력하고 오류가 덜 발생하는 경향이 있습니다.

  1. 스마트 포인터의 유형

C++에는 세 가지 유형의 스마트 포인터가 있습니다: Unique_ptr, shared_ptr 및 Weak_ptr. 이들은 모두 표준 헤더 파일에 정의되어 있으며 모두 템플릿 클래스입니다.

(1) Unique_ptr

unique_ptr은 배타적 포인터로, 언제든지 하나의 스마트 포인터만 개체를 ​​가리킬 수 있도록 보장합니다. 즉, Unique_ptr은 동일한 객체를 가리키는 여러 포인터를 금지합니다. Unique_ptr 포인터를 다른 스마트 포인터로 전송하려면 std::move() 함수를 사용해야 합니다.

다음은 Unique_ptr의 기본 사용을 보여주는 샘플 코드입니다.

std::unique_ptr<int> up(new int(10)); // 声明unique_ptr指针,并分配一个int类型的动态内存区域
std::cout << *up << std::endl; // 输出10
*up = 20; // 修改动态内存中的值
std::cout << *up << std::endl; // 输出20

unique_ptr 포인터가 해당 범위를 벗어나면 포인터가 가리키는 동적 메모리가 자동으로 해제된다는 점에 유의해야 합니다. (예외가 발생하더라도)

(2) shared_ptr

shared_ptr은 동일한 객체를 여러 포인터로 공유할 수 있으며, use_count() 함수를 사용하면 동일한 객체를 가리키는 포인터의 개수를 얻을 수 있습니다. 여러 포인터가 동일한 개체를 가리킬 수 있으므로 메모리 누수로 이어질 수 있는 순환 참조 상황을 피하기 위해 주의를 기울여야 합니다.

샘플 코드를 사용하는 방법은 다음과 같습니다.

std::shared_ptr<int> sp1(new int(10));
std::shared_ptr<int> sp2 = sp1;
std::cout << *sp1 << std::endl; // 输出10
std::cout << *sp2 << std::endl; // 输出10
std::cout << sp1.use_count() << std::endl; // 输出2

새로운 shared_ptr 포인터가 동일한 메모리 영역을 가리킬 때마다 메모리 영역의 참조 횟수가 1씩 증가한다는 점에 유의하세요. 마찬가지로 포인터가 해당 범위를 벗어나면 그에 따라 참조 횟수가 감소합니다. 메모리는 참조 카운트가 0이 될 때만 해제됩니다. (예외가 발생하더라도)

(3)weak_ptr

weak_ptr은 shared_ptr의 더 가벼운 버전입니다. 가리키는 객체를 제어할 수 없으며 사용하기 전에 shared_ptr로 변환해야 합니다. 참조 계산에 영향을 주지 않으므로 메모리 누수가 발생하지 않습니다. 그러나 Weak_ptr을 사용할 때는 가리키는 개체가 존재하는지 확인해야 합니다. 그렇지 않으면 제공되는 인터페이스를 사용하면 프로그램 오류가 발생합니다.

weak_ptr 사용 예는 다음과 같습니다.

std::shared_ptr<int> sp1(new int(10));
std::weak_ptr<int> wp = sp1;
std::cout << *wp.lock() << std::endl; // 使用weak_ptr提供的lock()函数将其转化为shared_ptr,并访问内存中的值
std::cout << wp.use_count() << std::endl; // 输出1

지정된 개체가 삭제되면 Weak_ptr.lock()에서 반환된 shared_ptr은 비어 있게 됩니다.

  1. 스마트 포인터 사용

스마트 포인터를 사용하면 관리하는 동적 메모리를 자동으로 해제할 수 있으므로 메모리 관리 작업이 크게 단순화될 수 있습니다. 스마트 포인터를 사용하는 경우 동적 메모리 할당 반환 값으로 초기화해야 합니다. 다음은 독자가 스마트 포인터의 사용을 더 잘 이해하는 데 도움이 되는 몇 가지 샘플 코드입니다.

// 使用unique_ptr
std::unique_ptr<int> up(new int(10));
std::unique_ptr<float[]> u_arr( new float[5] ); // 对数组使用unique_ptr
// 使用shared_ptr
std::shared_ptr<int> sp(new int(10));
std::shared_ptr<double> sp_arr(new double[5], [](double* p){ delete[] p; }); // 对数组使用shared_ptr,并在内部传递匿名的lambda表达式释放动态内存
std::shared_ptr<Base> spb = std::make_shared<Base>(); // 使用std::make_shared创建shared_ptr指针
std::shared_ptr<Derived> spd = std::make_shared<Derived>(); 
// 使用weak_ptr
std::weak_ptr<int> wp;

if (auto sp = wp.lock()) // 使用wp.lock()检查指向的对象
{
    // 操作所指向的对象
}
else
{
    // 找不到所指向的对象
}

일반 포인터와 스마트 포인터를 사용하여 동일한 동적 메모리를 가리키는 경우 스마트 포인터가 일반 포인터보다 먼저 소멸되므로 일반 포인터가 해제된 포인터를 쉽게 가리킬 수 있습니다( 사용할 수 없음) 메모리 공간.

  1. 요약

스마트 포인터는 매우 유용한 C++ 메모리 관리 방법으로 메모리 누수를 어느 정도 방지하고 프로그램의 유지 관리성을 향상시킬 수 있습니다. C++11 이후의 표준에서는 스마트 포인터가 메모리 관리의 기본 방법으로 권장됩니다. 실제 개발 과정에서 최상의 메모리 관리 효과를 얻으려면 특정 상황에 따라 사용할 스마트 포인터 유형을 선택해야 합니다.

위 내용은 C++의 스마트 포인터 살펴보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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