2013-05-02 10 views
0

를 사용하는 경우 (예 : strftime(), strcpy(), MultiByteToWideChar()) 문자 배열 (대신 std::string 's의) 하나가이 옵션을 가지고 처리 :문자 배열의 크기 일부 라이브러리 함수를 사용하는 경우 특정 라이브러리 함수

  • 는 고정을 사용합니다

    ,536,913 : 때문에 문자열 길이 제한 한이 같은 유틸리티 함수를 생성하고자 할 때 또한 나쁜 필요한 크기를 할당 할
  • 사용 new의 분명 나쁜 크기의 배열 (예 : char buffer[256];를)

    char * fun(void) 
    { 
        char * array = new char[exact_required_size]; 
        some_function(array); 
        return array; 
    } 
    

    이러한 기능을 사용하는 사용자는 deletearray이어야합니다.

그리고 하나 (하나는 함수가 반환하는 시간 문자열 예측할 수 없을 때) 문제가 기능을 사용하기 전에 정확한 배열 크기/길이를 알 수없는 경우 두 번째 옵션도 항상 가능한 것은 아니다 .

완벽한 길이는 가변 길이이고 소멸자는 메모리 할당을 담당하지만 많은 라이브러리 함수는 std::string (다른 질문이든 아니든)을 지원하지 않기 때문에 std::string을 사용하는 것이 가장 좋습니다.

그래, 뭐가 문제 야? 음 -이 기능들을 어떻게 사용해야합니까? 고정 크기 배열을 사용하거나 new을 사용하고 메모리 할당 해제에 대해 내 함수의 사용자가 걱정할 필요가 없습니까? 아니면 실제로 입니다. 내가 생각하지 못했던 매끄러운 솔루션입니까?

답변

0

std::stringdata() 메서드를 사용하면 현재 string 객체에 포함 된 동일한 문자 시퀀스를 갖는 문자 배열에 대한 포인터를 가져올 수 있습니다. 반환 된 문자 포인터는 내부 메모리의 어딘가에있는 수정 불가능한 문자 배열을 가리 킵니다. string 객체의 소멸자가 자동으로 그렇게하므로이 포인터가 참조하는 메모리 할당을 해제하는 것에 대해 걱정할 필요가 없습니다.

원래 질문과 관련하여 : 어떻게 기능을 작동 시키 느냐에 달려 있습니다. 함수 내에서 생성 한 문자 배열을 수정하는 경우 힙에 메모리를 할당하고 포인터를 반환해야하는 것처럼 들립니다. 사용자는 메모리 자체를 할당 해제해야합니다. 이렇게 많은 표준 라이브러리 함수가 있습니다.

또는 사용자가 문자 포인터를 매개 변수로 전달하도록 강제 할 수 있습니다.이 매개 변수는 배열을 이미 만들었고 메모리 자체의 할당을 해제해야한다는 것을 알고 있습니다. 이 방법은 훨씬 더 자주 사용되며 아마도 좋습니다.

+0

만약 내가 이해한다면 잘 모르겠다 - 나는 이렇게 sth 할 수 있다고 말한다 :'std :: string buffer; strcpy (buffer.data(), "text");'? – NPS