2012-02-23 2 views
2

У меня есть конструктор для моего Arduino-кода, который является чем-то вроде следующего:Нужно ли выделять память для указателя char на конструктор?

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

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

Мой вопрос: нужно ли мне выделить обугленного буфер вместо того, чтобы просто полагаться на указатель строки, который был принят? Я не работаю над строкой (кроме ее сокращения). Кажется, я не сталкивался с какими-либо проблемами, но я хотел проверить.

Это относится к ардуино, но ответы на C и C++ также будут приветствоваться.

ответ

3

Всё зависит.

В основном, так как теперь код указан, вам требуется, чтобы это имя было больше, чем время жизни экземпляра класса. Если имя всегда является строковым литералом, то есть X («foo»), тогда это приемлемо. В противном случае вызывающему нужно будет выделить строку, которая требует нечетного и подверженного ошибкам контракта.

Я бы предложил дублировать строку всегда в конструкторе, если не ясно, что он всегда должен быть строковым литералом.

3

Вам не нужно будет выделять буфер, но он, вероятно, более надежный. Тем более, что вы на встраиваемой системе, likey без отладчика, поэтому, если кто-то передает вам строку из стека вызывающего абонента, которую вы hosed. Попытка выяснить, где лежит эта проблема, - это как игла в стоге сена. Короче говоря, если кто-то передает вам некоторые данные, очень трудно гарантировать, что память сохранится, поэтому вам лучше позаботиться о распределении самостоятельно.

3

В этом случае вы можете столкнуться с проблемами.

X foo() { 

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

     X obj(ar); 

     return obj; 
} // ar is deallocated here. 

Но переменная член возвращаемого объекта _name все еще указывает на ar, который был ранее в стеке. Поэтому лучше выделять память, а затем освобождать ее, когда она больше не нужна.

Смежные вопросы