std::vector
은 자체 메모리를 관리합니다. 즉, 벡터의 소멸자가 호출 될 때 벡터에 의해 보유 된 메모리가 해제됩니다. std::vector
은 또한 객체의 소멸자가 제거 될 때 (erase
, pop_back
, clear
또는 벡터의 소멸자를 통해) 호출합니다.
이 할 때 :
Radio newradio(radioNum);
m_radios.push_back(newradio);
당신은 벡터에 (들 복사 Radio
'생성자를 사용하여 만든) newradio
의 사본을 추가합니다. newradio
은 범위를 벗어나면 파괴되며 벡터가 벡터에서 제거되면 복사본이 삭제됩니다 (모든 객체와 마찬가지로). 중요한 점이다
: std::vector
에만 저장 사본 의미 복사 생성자가 있어야합니다 물체 의미 객체의 (및 할당 연산자를하지만 그건 또 다른 문제이다). 벡터의 포인터가 있다면 포인터 자체가 아닌 포인터 자체가 복사됩니다. 이 동작은 모든 표준 컨테이너 (예 : std::list
또는 std::set
)와 동일합니다.
포인터를 사용하지 않는 경우 경험적으로 말하면 메모리를 직접 해제 할 필요가 없습니다. (vector
포함)에서는 C++ 11
대부분의 표준 컨테이너는 컨테이너의 끝에 곳에서 객체를 구축합니다
emplace_back
방법이있다. 많은 매개 변수가 필요하며 해당 매개 변수와 가장 잘 일치하는 생성자를 호출합니다 (또는 그러한 생성자가 없으면 실패합니다). 생성자를 사용하여 컨테이너의 끝에 복사하지 않고 개체를 만듭니다.는 C++ 11에서 또한 m_radios.emplace_back(radioNum); // construct a Radio in place,
// passing radioNum as the constructor argument
, 용기가 일반적으로 알고 이동 , 그래서 더 이상 복사 가능한 것으로 객체를 필요로하지 않는다 : 그래서, 위의 코드는 다음과 같이 다시 작성할 수 있습니다 그들은 이동를하는 경우, 다음 컨테이너는 필요에 따라 (예 : 재 할당 중에) 내용을 이동합니다. 벡터를 복사하려면 복사 가능 유형이 필요합니다.
때 올바른 비록,이 대답은 업데이 트 언급을 사용할 수는' –
아주 좋은 지적 씨 오리를 emplace_back'. –