2013-08-23 3 views
0

C++ std :: string 및이 인스턴스가 new로 인스턴스화되는 방법에 대한 답을 찾지 못하는 것 같습니다. 이제는 메모리 누수를 방지하기 위해 new에서 반환 된 모든 포인터를 삭제해야한다는 사실을 잘 알고 있습니다. 내 질문은 기존 포인터를 사용하여 새 문자열 객체를 인스턴스화 할 때 발생합니다. 다음의 간단한 예를 고려해보십시오 :힙에서 문자열 삭제 Char []에서 생성 된 C++의 힙

char* foo() { 
    char* ptr; 

    ptr = new char[ARBITRARY_VALUE]; 
    ... 
    ptr = strncpy("some null terminated string", ARBITRARY_VALUE) 
    ... 
    return ptr; 
} 

int main() { 

    char* buf; 
    std::string myStr; 

    buf = foo(); 
    myStr = new std::string(buf); 

    ...do stuff 

    delete myStr; 
    delete buf;   //Is this necessary? 
    return 0; 
} 

내 질문은 간단하다 : myStr는 buf가 사용하는 기본 메모리를 해제 또는 BUF 필요도 수동으로 해제해야합니까 삭제합니까? buf를 수동으로 해제해야한다면 익명 매개 변수의 경우 어떻게됩니까? 마찬가지로 :

myStr = new std::string(foo()); 

내 의심 표준 : : 문자열의 구현이 오직 문자 버퍼에 대한 포인터를 유지하고, 파괴시 포인터를 해제하지만 확실하지 오전 내 C++ 녹슨 때문이다 기껏해야.

보너스 질문 : 문제의 클래스가 std :: string 이외의 것이면 어떻게 바뀌나요? 나는 모든 사용자 생성 클래스에 대해 명시 적 소멸자가 구현 자에 의해 제공되어야한다고 가정하지만 다양한 다른 표준 클래스는 무엇입니까? 부모 개체의 삭제가 항상 개체를 완전히 파괴하기에 충분할 것이라고 가정하는 것이 안전합니까? (여기에서 내 단어를 신중하게 선택하려고합니다 : 개체가 가리키는 메모리를 해제하지 않는 것이 바람직한 경우가 있습니다. 하지만이 질문의 범위를 벗어납니다)?

+1

myStr = new std :: string (buf);는 유효한 코드가 아닙니다. 당신이 오타를 만든 것이 아니라면'myStr'은'std :: string *'입니다. – jrok

+0

이것을 읽고 그것에 의해 살아 가세요 : http://klmr.me/slides/modern-cpp/#1 – chris

+0

네,'std :: string'이 데이터의 복사본을 취하기 때문에'buf'를 삭제해야합니다 그것이 지적한 바에 따르면, 원래의 기억은 여전히 ​​존재합니다. 당신은'delete [] buf;'와 함께 할 것입니다. – jrok

답변

1

std::string은 C 스타일 Null 종료 문자열 (const char *)에서 초기화 할 수 있습니다. std::string에 대해 const char *free() d, delete[]() d 또는 그 이상이 필요한지 여부를 알 수있는 방법이 없으며 이미 언급 한대로 알 수 없습니다.

스마트 포인터를 사용하여 동적으로 할당 된 개체를 자동으로 삭제합니다. 이 중 몇 가지가 있으며, 각각 특별한 용도로 사용됩니다. scoped_ptr, auto_ptrshared_ptr을 확인하십시오. 귀하의 프로젝트에는 아마도 어떤 스마트 포인터를 사용할 지에 대한 제약이있을 것입니다.

C++의 문맥에서 수동으로 선언 된 문자 배열에 문자열을 보관할 이유가 전혀 없으므로 std::string을 사용하는 것이 훨씬 안전합니다.