2

ArduinoUnit单元测试库中,我提供了一种为 TestSuite 命名的机制。该库的用户可以编写以下内容:

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

这是预期的用法 - TestSuite 的名称是字符串文字。然而,为了防止难以发现的错误,我觉得有必要满足不同的用途,例如:

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

因此,我已经像这样实现了 TestSuite:

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_;
};

有什么方法可以更改接口以强制“正确”使用它,以便我可以取消动态内存分配?

4

6 回答 6

2

如果你提供两个重载的构造函数怎么办?

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

如果使用 a 调用const char*,则构造函数可以复制指针,假设字符串不会消失。如果使用 a 调用char*,构造函数可以复制整个字符串。

请注意,当它实际上是动态分配的时,仍然可以通过将 a 传递const char*给构造函数来破坏这种机制。name但是,这可能足以满足您的目的。

我应该注意,我实际上从未在 API 中看到过这种技术,这只是我在阅读您的问题时想到的一个想法。

于 2009-06-22T19:48:15.093 回答
1

好吧,您可以使用 std::string 来处理所有内存分配

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];
};

然而,这会浪费一些内存,这在嵌入式平台上可能是一个问题。

于 2009-06-22T14:15:35.267 回答
1

文档。例如,

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

共享指针意味着指向的对象在该对象的生命周期内必须是活动的。

于 2009-06-22T14:18:13.250 回答
1

拥有一个char name[XYZ] TestSuite 成员(XYZ 大到足以舒适地显示名称)并用于strncpy复制字符串(最大长度为 XYZ-1)。

于 2009-06-22T15:08:08.827 回答
-1

当您拥有可以在其构造函数中使用字符串文字或 char* 的不错的 C++ 字符串类时,为什么要使用 char* 和 malloc ?

于 2009-06-22T14:14:17.127 回答
-1

你可以使用 std::string 吗?您可以拥有它std::string name_并让 STL 为您处理内存分配..

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

      ~TestSuite() {}

    private:
      std::string name_;
};

不要忘记包括<string>.

参考

于 2009-06-22T14:15:09.090 回答