std :: string 객체에 이미 할당 된 char * 버퍼 (문자열 내용 포함)를 사용해야합니다. 몇 가지 연구가 끝나면 이것이 거의 불가능하고 std :: string은 항상 데이터의 자체 복사본을 갖게된다는 것을 알게되었습니다. 내가 이것을 할 수있는 유일한 나머지 방법은 이미 할당 된 char 버퍼의 주소를 반환하는 커스텀 할당자를 사용하는 것이다. 이를 위해 std :: string은 할당자를 사용하여 문자열 데이터를 보유하기위한 메모리를 할당하고 그 밖의 아무것도 할당하지 않아야합니다. 이 경우인가요?std :: string에서 사용자 정의 할당자를 사용하여 이미 할당 된 char 버퍼를 다시 사용하십시오.
8
A
답변
8
std::string
은 basic_string
의 typedef이며 이미이 명시 적으로 기본 할당자를 사용합니다. std::string
이 다른 할당자를 사용하는 방법은 없습니다. 원하는 할당자를 사용하여 basic_string
이라는 새로운 typedef를 만들었더라도 std::string
을 기대하는 API로 전달할 수 없습니다.
불행히도 현재 요구 사항 중 하나 이상을 완화 할 수 없다면 현재 C++ 표준에서 지정한 모든 요구 사항을 충족시킬 수있는 방법이 없습니다. 당신이 그렇게 할 수 있다면
한 가지 가능한 창조적 인 솔루션은 resize
을 활용하는 std::string
로 "시킴으로 빨리"char*
버퍼 를 할당하는 것입니다. 다음 당신은 swap
당신의 새것에 그 소유권을 가지고 가기 위하여 그 끈을 할 수 있었다.
+0
아, 생각 ... 이걸로 행운이 .. – user3612009
기본 버퍼를 소유하지 않고'std :: string' 인터페이스를 제공하는'string_view' 또는'string_ref'에 대한 제안이있었습니다. 또한 이러한 클래스의 자체 버전을 가진 라이브러리가 있습니다. Google은 이러한 용어와 귀하의 요구에 맞는 것을 제공합니다. – Praetorian
좋은 정보! 보세요. 하지만이 특별한 경우에는 API의 일부로 std :: string을 사용해야합니다. 정보 주셔서 감사합니다. – user3612009