2013-02-08 6 views
1

다음은 샘플 코드입니다. 내 applicaiton에서 사용하고있는 코드와 비슷한 샘플입니다.메모리 누출없이 const char * 초기화

#define STR_SIZE 32 

void someThirdPartyFunc(const char* someStr); 

void getString(int Num, const char* myStr) 
{ 
    char tempStr[] = "MyTempString="; 
    int size = strlen(tempStr) + 2; 
    snprintf((char*)myStr, size, "%s%d", tempStr, Num); 
} 

int main() 
{ 
    const char * myStr = new char(STR_SIZE); 
    getString(1, myStr); // get the formated string by sending the number 
    someThirdPartyFunc(myStr); // send the string to the thirdpartyFunction 
    delete myStr; 

    return 0; 
} 

이 코드를 사용하면 예외가 발생합니다. 문제는 "myStr"을 삭제하는 것입니다. 그러나 정말로 삭제가 필요합니다.

getString에서 문자열의 서식을 지정하고 ThirdPartyFunc로 보내는 다른 방법이 있습니까 ??

미리 감사드립니다.

+2

내가하는 일을 잘 모르겠다. 대신'std :: string'을 쓰지 않는 이유는 무엇입니까? – Rapptz

+0

'strlen (tempStr) + 2'에서'+ 2'가 왜 그렇게 설명 할 수 있습니까? –

+0

왜'myStr'을'const char *'로 가져 와서 함수에서 const를 캐스팅하고 있습니까? –

답변

8

이 라인이 아닌 문자의 배열되지만 한 문자를 할당한다.

당신이 크기 STR_SIZE의 배열을 원하는 경우 :

const char * myStr = new char[STR_SIZE]; 

(주 사각형 []). delete[] 연산자를 사용하여 할당 된 메모리 덩어리를 할당 해제해야합니다.

개인 메모 : 위에 작성한 코드 (수동으로 할당 한 문자열 등)는 좋은 교육 현명한 것입니다. 당신은 많은 실수를해서 C/C++의 내부 동작에 대해 배울 것입니다. 프로덕션 코드의 경우 원하지 않는 프로덕션 코드 인 std::string 또는 기타 문자열 컨테이너는 문자열 관련 실수를 반복하지 않아야합니다. 일반적으로 문자열 라이브러리가 어떻게 작동 할 것인지를 성공적으로 재창조하는 사람은 아닙니다. 동적 성장 가능 어레이 (std::vector) 또는 사전 유형 또는 기타와 같은 다른 컨테이너 유형에서도 마찬가지입니다.위의 코드를 둘러싼 교육용으로 좋은 목적을 제공합니다.

가 다른 사용자의 코드에 문제 (함수에 const char* 넘겨 다음 snprintf 등을 호출 할 때 올바르게 size 매개 변수를 계산하지, 램 수정)하지만, 이러한 여러분의 segfault의-문제에 관련이 없습니다.

+3

'delete []'not not delete. –

+0

감사합니다. 도움이되었습니다. :) – Jabez

4
기술 다시

대신

const char * myStr = new char(STR_SIZE); 

의 두 문자열이 ’t이 수정 될 수있는 문제가 있음을

char const myStr[STR_SIZE] = ""; 

참고 않습니다.

하지만 할당/할당 해제 문제에 대해서만 질문했습니다.


그렇다면 언어 기술 수준 이상의 수준에서는 잘못된 점이 많습니다.

여기에 완전한 원래 코드의 다음 #define가 더 자연스러운 코드에서 사라

#include <string>   // std::string 
#include <sstream>   // std::ostringstream 
using namespace std; 

void someThirdPartyFunc(char const*) {} 

string getString(int const num) 
{ 
    ostringstream stream; 
    stream << "MyTempString=" << num; 
    return stream.str(); 
} 

int main() 
{ 
    someThirdPartyFunc(getString(1).c_str()); 
} 

만이 할 수 있습니다 : 여기

void someThirdPartyFunc(const char* someStr); 

void getString(int Num, const char* myStr) 
{ 
    char tempStr[] = "MyTempString="; 
    int size = strlen(tempStr) + 2; 
    snprintf((char*)myStr, size, "%s%d", tempStr, Num); 
} 

int main() 
{ 
    const char * myStr = new char(STR_SIZE); 
    getString(1, myStr); // get the formated string by sending the number 
    someThirdPartyFunc(myStr); // send the string to the thirdpartyFunction 
    delete myStr; 

    return 0; 
} 

는 C++ 수준에서 그렇게하는 방법 모든 대문자 매크로 이름을 사용하더라도 매우 쉽게 원하지 않는 텍스트 대체를 초래합니다. 그리고 어쨌든 모든 대문자를 외치는 것은 어쨌든 눈꼬림입니다 (이것이 다른 대회와는 달리 매크로 이름 규칙 인 이유입니다). C++에서는 대신 const을 사용하십시오.

const char * myStr = new char(STR_SIZE); 

및 하나 개 할당 된 문자가이 경우에는 "숯 오버 플로우"를 야기 STR_SIZE의 값으로 초기화된다

+0

)을 사용할 수 없다. 제안 된 코드에서'getString()'의 인터페이스에 대해서도 논쟁 할 수있다. – akira