programing tip

std :: vector.clear ()는 각 요소에서 (사용 가능한 메모리)를 삭제합니까?

itbloger 2020. 12. 12. 10:12
반응형

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) 제목에 명시된 문제를 해결하는 유용하고 잘 알려지지 않은 라이브러리입니다.

참고 URL : https://stackoverflow.com/questions/594089/does-stdvector-clear-do-delete-free-memory-on-each-element

반응형