이것은 다소 서툴 릅니다.
<string.h>
은 C 헤더입니다. string
을 정의하지 않습니다. <iostream>
버전에 직접 또는 간접적으로 <string>
이 포함되어 있거나 오류가있는 것으로 보입니다.
리터럴 문자열 (쌍 따옴표로 묶인 것)은 읽기 전용 메모리 세그먼트를 포함하여 거의 모든 위치에있을 수 있습니다. (그들은 메모리를 차지하지만 큰 영향을 끼칠 텍스트가 많습니다. 전쟁과 평화은 완전한 메기를 차지하지 않습니다.)이 경우 std::string
은 이 값으로 초기화되고 나중에 다른 값이 할당됩니다. std::string
은 사용하는 메모리를 처리합니다.
C++에서 std::string
에 대한 포인터를 가질 이유가 거의 없습니다. std::string
은 내용이 없으면 공간을 많이 차지하지 않으며 내용 자체의 메모리를 관리합니다. 이걸 char *
과 혼동하고 있습니까?
new
std::string
b
에 대해 b
에 다른 주소를 할당하면 메모리가이되지 않습니다. 그것은 메모리 누수입니다. 무엇 new
에 대한 b
에 대한 에드 여전히 할당되어 있지만 거기에 방법이 없습니다 delete
, 그래서 그것은 프로그램의 기간 동안 메모리를 차지할 것입니다.
그런 다음 a
의 주소를 b
에 할당하면 delete b;
입니다. 이것은 나쁜 생각이며 아마도 예측할 수없는 방식으로 중요한 것을 엉망으로 만들 것입니다. new
으로 획득 한 메모리는 delete
입니다. (delete
ing의 중요한 점은 b
은 포인터이므로 삭제해야하지만, 가리키는 메모리는 new
을 통해 얻지 못했습니다.
메모리 관리는 이와 비슷한 방식으로 작동합니다. 문자열 리터럴은 어딘가에 할당됩니다. 당신이 아는 한 당신은 그것을 바꾸려고 시도해서는 안되며, 어떠한 수단으로도 delete
그것을 시도하면 안됩니다. 값을 사용하고 나머지는 만지지 마십시오. std::string
은 자체 내용의 메모리를 관리하며 소멸자에서 처리합니다. 함수 또는 다른 블록에서 선언 된 변수는 일단 범위를 벗어나면 소멸됩니다 (포인터가 스마트 포인터이거나 자체 메모리를 관리하는 경우에만 포인터가 가리키는 포인터는 자동으로 소멸되지 않습니다). new
메모리 인 경우 delete
d가 될 때까지 포인터 값을 버리지 마십시오. new
메모리가 없으면 delete
이 아닙니다.
+1 당신의 대답은 내 것이 더 완전합니다. – karlphillip
또는 문자열을 작은 범위로 묶을 수 있습니다 ... 대부분의 경우 가치가있는 것은 아닙니다. –