문제

나는 이전에 이것에 관한 관련 질문을 했으므로 정의되지 않은 행동을 알고 있습니다.

Const char *를 char *로 돌아 가기데이터 변경

string _str = "SDFDFSD";
char* pStr = (char*)_str.data();
for (int i = 0; i < iSize; i++)
    pStr[i] = ::tolower(pStr[i]);
.

나는 이것에 관한 나의 동료 중 한 명과 논의했다.그리고 그는 데이터의 길이를 변경하지 않으면이 시나리오에서 문제가 발생하지 않을 것이라고 말했습니다.데이터를 변경하지만 std::string가 데이터가 변경되었는지를 감지하는 방법이 없으므로 아무런 문제가 없으므로 아무런 문제가 없습니다._str에서 내부 불일치가 발생하지 않습니다.정말로 그럴 수 있습니까?

도움이 되었습니까?

해결책

정의되지 않은 행동 은 너무 많이 멈추고, 나는 두려워하고, 비강 데몬에 대한 언급은 그것이 다른 사람들보다 더 신화가 더 신화 였음을 확신 한 것처럼 보입니다.

귀하의 동료가 매우 민감한 것으로 보입니다. 따라서 귀하를 설득하기 위해서는 그에게 문제에 대한 구체적인 증거를 가져와야합니다.운 좋게도, 손에 gcc가있는 경우 완료 될 수 있습니다 :

#include <iostream>
#include <string>

int main() {
    std::string const UPPER = "HELLO, WORLD!";
    std::cout << "UPPER: " << UPPER << "\n";

    std::string lower = UPPER;
    for (char* begin = const_cast<char*>(lower.data()),
         * end = begin + lower.size();
         begin != end;
         ++begin)
    {
        *begin = std::tolower(*begin);
    }
    std::cout << "lower: " << lower << "\n";
    std::cout << "UPPER: " << UPPER << "\n";
    return 0;
}
.

gcc를 사용하는 경우, 여기에 당신이 얻는 것입니다 :

UPPER: HELLO, WORLD!
lower: hello, world!
UPPER: hello, world!   // What the hell ? UPPER was const !!!
.

왜?GCC는 역사적으로 쓰기 에 복사 속임수 이후로 쓰기를 감지하지 못하고 기본 스토리지 배열이 공유됩니다.

참고 : 예, 이것은 C ++ 11과 부적합하지 않습니다. 그러나 C ++ 11에서 일할 기회가 있었으면 좋겠습니다.

다른 팁

데이터 () 문서 :

데이터를 통해 액세스 한 문자 배열을 수정하는 것은 정의되지 않은 동작입니다.

동료가 잘못되었으므로 트릭이 없으며 정의되지 않은 동작입니다.일어나는 일은 구현입니다.

나쁜 생각!현재 또는 미래의 플랫폼에서 문자열이 어떻게 구현되는지 확인할 수는 없습니다.예를 들어, 어떻게 든 비슷한 다른 객체와 스토리지를 공유 할 수 있습니다.그것은 일부 플랫폼에서 데이터를 읽기 쉽게 세그먼트에 넣을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top