我是否需要为构造函数的char指针分配内存?

时间:2012-02-23 03:09:46

标签: c++ pointers arduino

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

取决于。

基本上,对于代码现在的方式,您要求该名称的生命周期大于该类实例的生命周期。如果name始终是字符串文字,即X(“foo”),那么这是可以接受的。否则,调用者必须分配字符串,这是一个奇怪且容易出错的合同要求。

我建议总是在构造函数中复制字符串,除非很明显它始终是字符串文字。

答案 2 :(得分:3)

在这种情况下,您可能遇到问题。

X foo() {

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

      X obj(ar);

      return obj;
} // ar is deallocated here.

但是返回的对象的成员变量_name仍然指向堆栈中较早的ar。因此,最好分配内存,然后在不再需要时释放它。