Використання необроблених рядків
Так, іноді ви дійсно можете це зробити. При використанні const char *, масивів char, виділених у стеку та рядкових літералах, ви можете це зробити таким чином, що взагалі не виділяється пам'ять.
Написання такого коду часто вимагає більшої продуманості та обережності, ніж використання рядка чи вектора, але за допомогою відповідних прийомів це можна зробити. За допомогою належних методів код може бути безпечним, але завжди потрібно переконатися, що під час копіювання у char [] ви маєте певні гарантії щодо довжини копіюваного рядка, або ви елегантно перевіряєте та обробляєте великі рядки. Якщо цього не зробити, це надало сімейству функцій strcpy репутацію небезпечних.
Як шаблони можуть допомогти написати безпечні буфери символів
Що стосується безпеки буферів char [], шаблони можуть допомогти, оскільки вони можуть створити інкапсуляцію для обробки розміру буфера для вас. Такі шаблони реалізовані, наприклад, корпорацією Майкрософт, щоб забезпечити безпечну заміну strcpy. Приклад тут витягнутий з мого власного коду, реальний код має набагато більше методів, але цього має бути достатньо, щоб передати основну ідею:
template <int Size>
class BString
{
char _data[Size];
public:
BString()
{
_data[0]=0;
_data[Size-1]=0;
}
const BString &operator = (const char *src)
{
strncpy(_data,src,Size-1);
return *this;
}
operator const char *() const {return _data;}
};
template <int Size>
inline const BString<Size> & strcpy(BString<Size> &dst, const char *src)
{
return dst = src;
}