2012-02-23 2 views
2

내가 좋아하는 무언가가 내 아두 이노 코드에 대한 생성자가 다음생성자에 대한 char 포인터를위한 메모리를 할당해야합니까?

class X { 
    private: 
    char* _name; 
    public: 
    X(char*); 
} 

X::X(char* name) { 
    _name = name; 
} 

내 질문은 : 나는 문자 버퍼 대신 전달 된 문자열 포인터에 의존을 할당해야합니까? 나는 문자열을 조작하지 않고 있습니다 (단축하는 것 이외에는). 나는 아직 어떤 문제에 부딪치지 않는 것 같지만 검증을 원했다.

이것은 arduino에만 해당하지만 C 및 C++에 대한 응답도 환영합니다.

답변

3

다릅니다.

기본적으로 코드는 현재 클래스의 인스턴스 수명보다 수명이 길어야합니다. name이 항상 문자열 리터럴 인 경우 (예 : X ("foo")) 허용됩니다. 그렇지 않으면, 호출자는 스트링을 할당해야하는데, 이것은 홀수이고 오류가 발생하기 쉬운 계약이다.

문자열 상수 일 것으로 항상 명확한 경우가 아니라면 항상 생성자에서 문자열을 복제하는 것이 좋습니다.

3

버퍼를 할당 할 필요는 없지만 더 강력 할 수 있습니다. 특히 임베디드 시스템을 사용하고 있기 때문에, 디버거가 없기 때문에 호출자의 스택에서 문자열을 전달하면 묶여 있습니다. 그런 종류의 문제가있는 곳을 찾아내는 것은 건초 더미에있는 바늘과 같습니다. 간단히 말해, 누군가 데이터를 전달하면 메모리가 유지된다는 것을 보장하기가 매우 어렵 기 때문에 직접 할당을 처리하는 것이 좋습니다.

3

이 경우 문제가 발생할 수 있습니다.

X foo() { 

     char ar[10]; 
     strcpy(ar,"Hello"); 

     X obj(ar); 

     return obj; 
} // ar is deallocated here. 

그러나 반환 된 객체의 멤버 변수 _name은 여전히 ​​이전 스택에 있던 ar을 가리키는. 따라서 메모리를 할당 한 다음 더 이상 필요 없게되면 메모리를 확보하는 것이 좋습니다.

관련 문제