std :: vector.clear ()는 각 요소에서 (사용 가능한 메모리)를 삭제합니까?
이 코드를 고려하십시오.
#include <vector>
void Example()
{
std::vector<TCHAR*> list;
TCHAR* pLine = new TCHAR[20];
list.push_back(pLine);
list.clear(); // is delete called here?
// is delete pLine; necessary?
}
각 요소를 list.clear()
호출 합니까 delete
? 즉, 전후에 메모리를 해제해야 list.clear()
합니까?
아니요 (대머리 포인터의 파괴가 아무것도하지 않기 때문에 예제에서 제안한 것처럼 마지막에 직접 삭제해야합니다). 그러나 부스트 [또는 다른 RAII 기반 관용구] 스마트 포인터를 사용하여 올바른 일을 auto_ptr
수행하도록 할 수 있습니다 (복사 등에서 호환되지 않는 동작이 있으므로 컨테이너에서 올바르게 작동하지 않음).하지만 다음의 함정을 이해하고 있는지 확인하십시오. 사용하기 전에 이러한 스마트 포인터. (Benoit가 언급했듯이,이 경우 basic_string
여기에서 실제로 찾고있는 것이 바로 여기입니다.)
스마트 포인터의 함정을 이해할 필요가 있다고 말하고 암시 적으로 메모리 관리를 처리하여 명시 적으로 수행 할 필요가 없도록하는 것은 오류 발생 가능성이 훨씬 적습니다.
편집 : Earwicker와 James Matta의 강력한 자극 덕분에 Benoit이 훨씬 더 철저한 답변을 한 요소를 포함하도록 실질적으로 수정되었습니다. 이에 대해 실사를 수행하도록 밀어 주셔서 감사합니다!
std::vector
호출 될 때 포함 된 모든 요소의 소멸자를 호출합니다 clear()
. 특정 경우에는 포인터를 파괴하지만 개체는 그대로 유지됩니다.
스마트 포인터는 올바른 방법이지만 조심하십시오. auto_ptr
표준 컨테이너에서는 사용할 수 없습니다. boost::scoped_ptr
둘 다 할 수 없습니다. boost::shared_ptr
할 수 있지만 객체에 대한 포인터가 없기 때문에 실제로는 배열을 사용하고 있기 때문에 귀하의 경우에는 작동하지 않습니다. 따라서 문제에 대한 해결책은 boost::shared_array
.
하지만 std::basic_string<TCHAR>
대신 문자열 작업의 이점을 누리면서 메모리 관리를 다룰 필요가없는 대신 사용 하는 것이 좋습니다 .
이 작업을 수행하는 간단한 템플릿 함수를 작성할 수 있습니다.
template <class T>
void deleteInVector(vector<T*>* deleteme) {
while(!deleteme->empty()) {
delete deleteme->back();
deleteme->pop_back();
}
delete deleteme;
}
여기에 뭔가 나쁜 습관이 있을지 모르지만 나는 그렇게 생각하지 않습니다. 댓글은 항상 멋지지만 괜찮아 보입니다.
그렇지 않다는 것을 알 수있는 한 가지 방법이 있습니다. 완전히 정의되지 않은 클래스에서 시도해보세요.
#include <vector>
class NotDefined;
void clearVector( std::vector<NotDefined*>& clearme )
{
clearme.clear(); // is delete called here?
}
이 조각이 컴파일되면 소멸자가 정의되지 않았기 때문에 소멸자를 호출 할 수 없습니다.
아니. 다른 곳에서는 포인터를 사용하지 않는다는 보장이 없기 때문에 그렇게하지 않습니다. 포인터 변수가 아니라면 소멸자를 호출하여 해제합니다.
Boost Pointer Container Library 를 사용할 수도 있습니다 . 여기서 특별히 권장하지는 않지만 (다시 말하지만 단일 객체 대신 배열을 사용하기 때문에 std::string
) 제목에 명시된 문제를 해결하는 유용하고 잘 알려지지 않은 라이브러리입니다.
'programing tip' 카테고리의 다른 글
Kotlin에서 Mockito를 사용할 수 있습니까? (0) | 2020.12.12 |
---|---|
자바 스크립트 콜백 범위 (0) | 2020.12.12 |
ASP.NET MVC로 로그온 시스템을 만들 수 있지만 MembershipProvider를 사용하지 않을 수 있습니까? (0) | 2020.12.12 |
정규식 일치 수 (0) | 2020.12.12 |
파이썬에서 즉시 변수 이름 생성 (0) | 2020.12.12 |