>백엔드 개발 >C++ >C의 벡터에 고유 포인터를 직접 넣을 수 없는 이유는 무엇입니까?

C의 벡터에 고유 포인터를 직접 넣을 수 없는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-29 02:35:09988검색

Why Can't I Directly Push a Unique Pointer into a Vector in C  ?

문제 이해: 벡터에 고유 포인터 삽입

제공된 코드는 고유 포인터를 벡터에 푸시하려고 시도합니다. 그러나 오류 메시지는 컴파일 실패의 이유를 나타냅니다.

error: deleted function 'std::unique_ptr<int>::unique_ptr(const std::unique_ptr<int>&)'

이 오류는 고유 포인터를 복사하는 것이 허용되지 않기 때문에 발생합니다.

고유 포인터의 특성

고유 포인터는 이름에서 알 수 있듯이 동적 메모리 위치에 대한 독점 소유권을 설정합니다. 이는 보유된 포인터의 소유권을 가진 고유한 포인터 컨테이너가 하나만 있음을 보장합니다. 결과적으로 고유 포인터의 복사본을 만드는 것은 허용되지 않습니다. 복사하면 동일한 동적 메모리의 소유권을 주장하는 두 개의 고유 포인터가 발생하며 이는 고유 소유권의 고유 규칙을 위반합니다.

대신 고유 포인터의 소유권을 다른 컨테이너나 함수로 이전해야 하는 경우 이동은 C의 의미론이 작용합니다.

문제 해결: 이동 의미론 활용

컴파일 오류 및 문제 해결 고유 포인터를 벡터로 밀어넣는 것은 이동 의미론을 활용하는 데 있습니다. std::move 함수를 사용하여 구현된 이동 의미 체계는 복사본을 생성하지 않고 고유 포인터의 소유권을 전송합니다.

이 시나리오에서 수정된 코드 조각은 다음과 같습니다.

int main()
{
    std::vector<std::unique_ptr<int>> vec;

    int x(1);
    std::unique_ptr<int> ptr2x(new int(x)); // Allocate the object dynamically
    vec.push_back(std::move(ptr2x)); // Transfer ownership with move semantics

    return 0;
}

std::move를 사용하면 ptr2x의 소유권이 vec로 이전되고 ptr2x에는 nullptr이 남습니다.

위 내용은 C의 벡터에 고유 포인터를 직접 넣을 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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