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 이외의 것이면 어떻게 바뀌나요? 나는 모든 사용자 생성 클래스에 대해 명시 적 소멸자가 구현 자에 의해 제공되어야한다고 가정하지만 다양한 다른 표준 클래스는 무엇입니까? 부모 개체의 삭제가 항상 개체를 완전히 파괴하기에 충분할 것이라고 가정하는 것이 안전합니까? (여기에서 내 단어를 신중하게 선택하려고합니다 : 개체가 가리키는 메모리를 해제하지 않는 것이 바람직한 경우가 있습니다. 하지만이 질문의 범위를 벗어납니다)?
myStr = new std :: string (buf);는 유효한 코드가 아닙니다. 당신이 오타를 만든 것이 아니라면'myStr'은'std :: string *'입니다. – jrok
이것을 읽고 그것에 의해 살아 가세요 : http://klmr.me/slides/modern-cpp/#1 – chris
네,'std :: string'이 데이터의 복사본을 취하기 때문에'buf'를 삭제해야합니다 그것이 지적한 바에 따르면, 원래의 기억은 여전히 존재합니다. 당신은'delete [] buf;'와 함께 할 것입니다. – jrok