그래서 내가 벡터과 같이 있습니다원시 포인터가있는 벡터에서 std :: unique_ptr을 삭제하는 가장 좋은 방법은 무엇입니까?
std::vector<std::unique_ptr<SomeClass>> myVector;
그럼이 SomeClass
의 원시 포인터를 포함하는 다른 벡터 :
std::vector<SomeClass*> myOtherVector;
그것은 또한 myVector
내부에있을 것입니다 myOtherVector
내부 요소가있는 경우, 그래서 나는 myOtherVector
에있는 각 요소를 통과하고 myVector
에서 같은 요소를 제거하고 싶습니다. 그런 다음 벡터를 지 웁니다.
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), myOtherVector[i]), myVector.end());
}
myOtherVector.clear();
myVector
고유 포인터를 보유하지만 난 remove()
기능을 원시 포인터를주는거야 때문에 이것은 컴파일시 오류가 발생합니다 : 이것은 내가 생각 해낸 것입니다. 이것은 내가이 문제를 해결할 적절한 방법이 무엇인지 모르기 때문에 도움이 필요한 곳입니다. 이 모든
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::unique_ptr<SomeClass>(myOtherVector[i])), myVector.end());
프리스트 지금은 같은 객체를 참조하는 두 std::unique_ptr
들 때문에 잘못된 : 나는에 라인을 변경했습니다. myVector
내부의 요소에는 참조가 포함되어 있으며 위의 행에서 고유 한 포인터의 구성이 또 다른 참조입니다. 그리고 같은 유형을 얻기 위해 새 포인터를 생성하는 것이 개념적으로 올바른 작업을 수행하는 것인지 알지 못합니다. 그럼 내가 공유 포인터에 고유 포인터를 변경 : ". ApplicationName.exe가 중단 점을 트리거하고있다"나는 myVector.erase()
라인 말했다 런타임 오류가 발생하여 응용 프로그램을 실행
std::vector<std::shared_ptr<SomeClass>> myVector;
std::vector<SomeClass*> myOtherVector;
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::shared_ptr<SomeClass>(myOtherVector[i])), myVector.end());
}
myOtherVector.clear();
계속 클릭하면 디버그 어설 션 오류가 발생합니다.
분명히 내가 잘못하고있는 것이 분명하지만, 나는 무엇을 모르겠다. 원시 포인터가있는 벡터에서 스마트 포인터를 지우는 올바른 방법은 무엇입니까?
당신이 생각 했 unique_ptr에서)를가 (얻을 기능을 비교 원시 포인터를 지정해야합니다? –
'std :: unique_ptr'는 소유 포인터를 반환하는'get' 멤버를 가지고 있습니다. –
어, 제안입니다. 'std :: shared_ptr'라고하는 또 다른 C++ 11 스마트 포인터가 있습니다. –