2014-11-29 3 views
2

예제 코드 :반환되는 변수가 차지하는 메모리를 어떻게 비울 수 있습니까 (C++, 클래스, 소멸자에서 사용)?

class Myclass 
{ 
    char * function(const char *x, const char *y) 
    { 
     char *a, *b, *c; 
     *a = strdup(x); 
     *b = strdup(y); 
     *c = (char *) malloc(strlen(a) + strlen(b) + 1); 
     ... 
     ... 
     free(a); 
     free(b); 
     return c; 
    } 
}; 

어떻게 c에 의해 점유 된 메모리를 free합니까? 소멸자에서 처리하려고하면 use of undeclared identifier c이 표시됩니다. 생성자에서 메모리를 할당하지 않고 메모리를 확보 할 수 있습니까?

+0

를 원시 C 포인터를 사용하지 마십시오 :

class Myclass { std::string function(const char *x, const char *y) { // no more overhead than strdup - and much safer! std::string a(x), b(y); // what I shall return std::string c; // un-necessary, but can improve efficiency c.reserve(a.size() + b.size()); // perform my complex string algorithm //... for example, concatenate into c: c = a + b; // return my result return c; } }; 

지금과 같이 호출합니다. 'std :: string'을 인수의 형식으로 사용하고 결과를 함수에 써야합니다. C++ 11에서 좋은 책을 읽어야합니다. –

+0

왜 C++ 코드에서'malloc'을 사용하고 있습니까? 그리고 'strdup'? 왜'std :: string'이 아닌가? –

답변

3

class destructorconstructors for that class이 할당 한 메모리를 해제해야합니다. 그것이 소유권입니다. function 그래서 당신이 function에서 c를 반환 및 발신자가 메모리에 delete/free를 호출하는 것을 확인하지 않는 확실한 샷 메모리 누수 즉 그 기능을 넘어 존재 중단에

또한, 코드에서 c 지역이다. 그러나 이것은 usability 부서에 많은 부담을줍니다.

1

c이 멤버 변수 인 경우 컴파일러에서 free(c);을 호출 할 수 없습니다. 이는 컴파일러에서 알려줍니다.

이 경우 MyClass::function의 호출자가 free을 반환 값으로 호출하는지 확인해야합니다.

2

답 : 정지!

당신이 C++로 쓰고 있다는 것을 기억하십시오. 올바른 일은 메모리 관리를 표준 라이브러리에두고 포인터가 아닌 값을 반환하는 것입니다. , 실제로

{ 
    MyClass x; 
    auto s = x.function("hello", "world"); 

    // s is a std::string. if I *really* want a pointer, I can... 
    const char* p = s.c_str(); 

    // note: no need to free *anything* 
} 
+0

고마워, 나는 이미 며칠 전에 또 다른 대답을 이미 받아 들였다. 그래서, 나는 단지 당신의 대답을 upvoted. 곧'string' 데이터 타입을 사용하도록 클래스를 업데이트 할 것입니다. 다시 감사합니다! – aste123

+0

왜 '자동'을 사용 했습니까? 기본적으로'auto'가 아닌가? – aste123

+1

자동 의미가 C++ 11에서 변경되었습니다. 그것은 '과제의 오른쪽에서 유형을 추론' –

관련 문제