我有一个Arduino代码的构造函数,如下所示:

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

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

我的问题是:我是否需要分配一个char缓冲区而不是仅仅依赖于传递的字符串指针? 我不是在字符串上操作(除了缩短它)。 我似乎还没有遇到任何问题,但我想验证。

这是针对arduino的,但对C和C ++的响应也会受到欢迎。

===============>>#1 票数:3

您不需要分配缓冲区,但它可能更强大。 特别是因为你是在一个嵌入式系统上,比如没有调试器,所以如果有人从调用者的堆栈中传递了一个字符串,你就会被清除。 试图找出那种问题所在,就像大海捞针一样。 简而言之,如果有人向您传递了一些数据,那么很难保证内存会持续存在,因此您最好自己处理这些分配。

===============>>#2 票数: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 因此,最好分配内存,然后在不再需要时释放它。

  ask by Brian D translate from so

未解决问题?本站智能推荐: