스마트 포인터 예제

스마트 포인터 예제

다음 예제는 원시 포인터 선언을 스마트 포인터 선언과 비교합니다. Auto_ptr2의 mptr이 가리키는 개체와 연관된 소멸자가 Auto_ptr2 자체가 범위를 벗어났기 때문에 소멸될 때 다른 개체를 해당 포인터로 `이동`한 경우에도 트리거된다고 말하는 것도 사실입니까? 기술적으로 이것은 std::unique_ptr에는 복사 생성자가 없기 때문에 발생합니다. 이 기사의 두 번째 부분에서는 올바른 방법으로 스마트 포인터를 전달하는 방법을 설명합니다. 참고: 이 두 번째 경우 unique_ptr가 이미 기존 개체에 대한 포인터를 보유하고 있는 경우 이 개체가 먼저 삭제된 다음 새 포인터가 저장됩니다. 이 대답은 다소 오래되었기 때문에 부스트 라이브러리에서 제공하는 스마트 포인터였던 당시의 `좋은`에 대해 설명합니다. C++11 이후 표준 라이브러리는 충분한 스마트 포인터 유형을 제공하므로 std:unique_ptr, std:shared_ptr 및 std:weak_ptr을 사용하는 것이 선호되어야 합니다. 스마트 포인터는 메모리 할당 해제, 리소스 공유 및 전송에 대해 걱정할 필요가 없는 포인터입니다. 재스민이 프로그램의 끝에서 범위를 벗어날 때, 그 소멸자는 메모리를 정리 할 수 없습니다 : 재스민 데이터를 가리키는 하나의 스마트 포인터가 여전히 있습니다, 즉 albert->동반자입니다. 마찬가지로, 알버트가 프로그램의 끝에서 범위를 벗어날 때, 그 소멸자는 메모리를 정리 할 수 없습니다 : 알버트 데이터에 대한 참조는 여전히 재스민 -> 동반자를 통해 살고 있습니다. 이 시점에서 프로그램은 메모리를 확보하지 않고 종료 : 모든 화려메모리 누수. 위의 스니펫을 실행하면 ~Player()가 호출되지 않는 방법을 알 수 있습니다. 모든 할당이 Java에서 작동하므로 이 포인터를 비슷한 방식으로 사용할 수 있습니다.

스마트 포인터에서 트릭은 소멸자가 수행하는 동안 자바 가비지 수집기에서 트릭을 수행합니다. C ++17까지는 배열을 보유하는 std::shared_ptr을 작성하는 쉬운 방법이 없습니다. C++17 이전에이 스마트 포인터는 항상 리소스에서 기본적으로 삭제 (및 삭제하지 않음)를 호출합니다: 사용자 지정 삭제기를 사용하여 해결 방법을 만들 수 있습니다. 많은 std::shared_ptr 생성자 중 하나는 람다를 두 번째 매개 변수로 사용하며, 여기서 소유한 개체를 수동으로 삭제합니다. 예를 들어 대부분의 경우 실제 리소스를 가리키는 원시 포인터 또는 리소스 핸들을 초기화하면 포인터를 스마트 포인터에 즉시 전달합니다. 최신 C++에서 원시 포인터는 성능이 중요하고 소유권에 대한 혼동이 없는 제한된 범위, 루프 또는 도우미 함수의 작은 코드 블록에서만 사용됩니다. shared_ptr 참조 계산 스마트 포인터입니다. 예를 들어 컨테이너에서 포인터 복사본을 반환하지만 원본을 유지하려는 경우와 같이 여러 소유자에게 원시 포인터를 할당하려는 경우 사용합니다.

모든 shared_ptr 소유자가 범위를 벗어났거나 소유권을 포기할 때까지 원시 포인터는 삭제되지 않습니다. 크기는 두 개의 포인터입니다. 하나는 개체용이고 다른 하나는 참조 수를 포함하는 공유 제어 블록에 해당합니다. 헤더 파일: . 자세한 내용은 공유_ptr 인스턴스 및 shared_ptr 클래스 를 만들고 사용하는 방법을 참조하세요. Bar 클래스의 개체가 만들어지면 pFoo에 저장되는 Foo 클래스의 새 개체가 만들어집니다. pFoo에 액세스하려면 Bar::getFoo를 호출하여 std::shared_ptr을 Bar 생성자에서 만든 Foo 개체에 반환합니다. 내부적으로 std::shared_ptr 개체의 복사본이 만들어지고 반환됩니다.

std::shared_ptr의 복사 생성자는 Foo 개체에 대한 내부 포인터를 복사하고 참조 수를 늘입니다. 예를 들어, 다음과 같은 예에서 발생합니다: 실제로 `기본 복사본`과 @Auto_ptr2 클래스와 관련된 의미 체계 사이의 동작 의 유일한 차이점은 소스 포인터의 할당일 뿐이라는 말에 맞습니까? nullptr (소스가 범위를 벗어날 때 가리키는 데 사용된 메모리가 소멸되지 않도록)? 컴퓨터 과학에서 스마트 포인터는 자동 가비지 수집 또는 경계 검사와 같은 추가 기능을 제공하면서 포인터를 시뮬레이션하는 추상 데이터 형식입니다.

Share this post