我有一个Arduino代码的构造函数,如下所示:
class X {
private:
char* _name;
public:
X(char*);
}
X::X(char* name) {
_name = name;
}
我的问题是:我是否需要分配一个char缓冲区而不是仅仅依赖于传递的字符串指针?我不是在字符串上操作(除了缩短它)。我似乎还没遇到任何问题,但我想验证。
这是针对arduino的,但对C和C ++的回复也会受到欢迎。
答案 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
。因此,最好分配内存,然后在不再需要时释放它。