오류 이해
다음 프로그램을 고려해보세요.
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); // Error occurs here }
겉보기에 무해해 보이는 이 코드는 Unique_ptr을 푸시하려고 시도합니다. 벡터로. 그러나 오류로 인해 컴파일이 실패합니다.
error: deleted function 'std::unique_ptr<int>::unique_ptr(const std::unique_ptr<int>&)'
unique_ptr의 특성
unique_ptr은 관리에 사용되는 C 표준 라이브러리의 기본 부분입니다. 동적으로 할당된 객체의 수명 캡슐화한 포인터가 복사될 수 없도록 보장합니다. 이는 관리되는 개체의 소유권이 고유_ptr 컨테이너에만 있다는 것을 의미합니다.
문제
프로그램이 고유_ptr의 복사본을 컨테이너에 푸시하려고 시도하기 때문에 오류가 발생합니다. 벡터. 그러나 앞서 언급한 것처럼 Unique_ptrs는 복사할 수 없습니다. 대신 이동만 가능합니다.
해결 방법
따라서 문제를 해결하려면 std::move 함수를 사용하여 Unique_ptr의 소유권을 이전해야 합니다. 원래 변수에서 벡터로. 수정된 코드는 다음과 같습니다.
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(std::move(ptr2x)); // Use std::move to transfer ownership }
이제 컴파일러는 오류 없이 프로그램을 성공적으로 컴파일하고 실행할 수 있습니다.
추가 고려 사항
코드에서 Unique_ptr의 사용이 올바르지 않다는 점에 유의하는 것이 중요합니다. Unique_ptr은 동적으로 할당된 개체를 관리하기 위한 것입니다. 코드의 포인터는 함수가 반환될 때 소멸될 지역 변수를 가리키고 있습니다. 이 문제를 해결하려면 코드에서 개체를 동적으로 할당해야 합니다.
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; std::unique_ptr<int> ptr(new int(1)); // Dynamically allocate the object vec.push_back(std::move(ptr)); }
또는 std::make_unique 함수를 사용하여 Unique_ptr을 만들고 개체를 한 줄에 할당할 수 있습니다.
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; vec.push_back(std::make_unique<int>(1)); }
위 내용은 `unique_ptr`을 `벡터`로 푸시하려면 왜 `std::move`가 필요합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!