2012-02-23 71 views
2

我有我的Arduino的代码,构造函数是类似以下内容:我是否需要为构造函数的char指针分配内存?

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

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

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

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

回答

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较早在堆栈上了。所以,最好分配内存,然后在不再需要时释放内存。

相关问题