AVR-GCC C ++ 생성자에게 전달 된 문자열을 복사 할 필요성을 어떻게 방지 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1027416

문제

에서 Arduinounit 단위 테스트 라이브러리 테스트 수양 이름을 제공하는 메커니즘을 제공했습니다. 도서관 사용자는 다음을 작성할 수 있습니다.

TestSuite suite("my test suite");
// ...
suite.run(); // Suite name is used here

이것은 예상되는 사용법입니다. 테스트 스위트의 이름은 문자열 문자입니다. 그러나 찾기 어려운 버그를 방지하기 위해 다른 사용법을 수용 할 의무가 있습니다.

char* name = (char*) malloc(14);
strcpy(name, "my test suite");
TestSuite suite(name);
free(name);
// ...
suite.run(); // Suite name is used here

따라서 나는 다음과 같은 시험소를 구현했다.

class TestSuite {
public:
  TestSuite(const char* name) {
    name_ = (char*) malloc(strlen(name) + 1);
    strcpy(name_, name);
  }

  ~TestSuite() {
    free(name_);
  }

private:
  char* name_;
};

생성자에서 메모리 할당 실패를 처리하지 못하는 문제를 제외하고는 다음과 같은 멤버 변수에 포인터를 할당하는 것을 선호합니다.

class TestSuite {
public:
  TestSuite(const char* name) : name_(name) {
  }

private:
  const char* name_;
};

동적 메모리 할당을 없애기 위해 '올바르게'사용하도록 인터페이스를 변경할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

두 개의 과부하 생성자를 제공하면 어떻게됩니까?

TestSuite(const char* name) ...
TestSuite(char* name) ...

a로 호출 된 경우 const char*, 그런 다음 생성자는 문자열이 사라지지 않을 것이라고 가정 할 때 포인터의 사본을 만들 수 있습니다. a로 호출 된 경우 char*, 생성자는 전체 문자열의 사본을 만들 수 있습니다.

전달 하여이 메커니즘을 파괴하는 것이 여전히 가능하다는 점에 유의하십시오. const char* 때 생성자에게 name 실제로 동적으로 할당됩니다. 그러나 이것은 귀하의 목적에 충분할 수 있습니다.

나는 실제로 API에서 사용 된이 기술을 본 적이 없다는 점에 주목해야합니다. 그것은 당신의 질문을 읽을 때 나에게 일어난 생각이었습니다.

다른 팁

선적 서류 비치. 예를 들어,

/**
* Test suite constructor.
* @param name test suite name cstring, shared
*/
TestSuite(char const *name) {
// ...

공유 포인터는이 객체의 수명 동안 뾰족한 물체가 살아 있어야 함을 암시합니다.

글쎄, 당신은 모든 메모리 할당을 처리 할 std :: 문자열을 사용할 수 있습니다.

class TestSuite {
public:
  TestSuite(const std::string &name):name_(name) {
  }

  ~TestSuite() {
  }

private:
  std::string name_;
};

편집하다 : Malloc ()에게 전화를 걸면 피하고 싶은 경우 다음을 수행 할 수 있습니다.

class TestSuite {
public:
  TestSuite(const char *name){
    memcpy(name_, name, min(16, strlen(name));
  }

private:
  char name_[16];
};

그러나 이것은 일부 메모리를 낭비 할 것이며, 이는 임베디드 플랫폼에서 문제가 될 수 있습니다.

가지고있다 char name[XYZ]테스트 스위트 회원 (이름을 편안하게 표시하기에 충분히 큰 XYZ 포함) 및 사용 strncpy 문자열을 복사합니다 (최대 길이 XYZ-1).

생성자에 문자열 문자 또는 char*를 가져갈 수있는 멋진 C ++ 문자열 클래스가있을 때 왜 char*와 malloc을 사용하고 있습니까?

std :: string을 사용할 수 있습니까? 당신은 그것을 가질 수 있습니다 std::string name_ 그리고 STL이 당신을 위해 메모리 할당을 처리하도록하십시오 ..

class TestSuite {
    public:
      TestSuite(const char* name) : name_(name) {}

      ~TestSuite() {}

    private:
      std::string name_;
};

포함하는 것을 잊지 마십시오 <string>.

참조

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