首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免复制传递给avr-gcc C++构造函数的字符串?

如何避免复制传递给avr-gcc C++构造函数的字符串?
EN

Stack Overflow用户
提问于 2009-06-22 14:07:37
回答 6查看 846关注 0票数 2

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

代码语言:javascript
复制
TestSuite suite("my test suite");
// ...
suite.run(); // Suite name is used here

这是预期的用法- TestSuite的名称是字符串文字。然而,为了防止很难找到的bug,我觉得有义务满足不同的用法,例如:

代码语言:javascript
复制
char* name = (char*) malloc(14);
strcpy(name, "my test suite");
TestSuite suite(name);
free(name);
// ...
suite.run(); // Suite name is used here

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

代码语言:javascript
复制
class TestSuite {
public:
  TestSuite(const char* name) {
    name_ = (char*) malloc(strlen(name) + 1);
    strcpy(name_, name);
  }

  ~TestSuite() {
    free(name_);
  }

private:
  char* name_;
};

抛开无法处理构造函数中内存分配失败的问题,我更喜欢简单地将指针分配给成员变量,如下所示:

代码语言:javascript
复制
class TestSuite {
public:
  TestSuite(const char* name) : name_(name) {
  }

private:
  const char* name_;
};

有没有什么方法可以改变接口,强制“正确”使用它,这样我就可以取消动态内存分配了?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-06-22 19:48:15

如果你提供了两个重载的构造函数呢?

代码语言:javascript
复制
TestSuite(const char* name) ...
TestSuite(char* name) ...

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

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

我应该指出的是,我从来没有真正看到过在API中使用这种技术,这只是我在阅读您的问题时突然想到的一个想法。

票数 2
EN

Stack Overflow用户

发布于 2009-06-22 14:15:35

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

代码语言:javascript
复制
class TestSuite {
public:
  TestSuite(const std::string &name):name_(name) {
  }

  ~TestSuite() {
  }

private:
  std::string name_;
};

malloc编辑:如果您想要避免调用malloc(),可以这样做:

代码语言:javascript
复制
class TestSuite {
public:
  TestSuite(const char *name){
    memcpy(name_, name, min(16, strlen(name));
  }

private:
  char name_[16];
};

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

票数 1
EN

Stack Overflow用户

发布于 2009-06-22 14:18:13

文档。例如,

代码语言:javascript
复制
/**
* Test suite constructor.
* @param name test suite name cstring, shared
*/
TestSuite(char const *name) {
// ...

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1027416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档