Utilisation de la chaîne brute
Oui, il est parfois possible de le faire. Lorsque vous utilisez des const char *, des tableaux de chars alloués sur la pile et des chaînes de caractères littérales, vous pouvez le faire de manière à ce qu'il n'y ait pas d'allocation de mémoire du tout.
L'écriture d'un tel code demande souvent plus de réflexion et de soin que l'utilisation d'une chaîne de caractères ou d'un vecteur, mais avec des techniques appropriées, c'est possible. Avec des techniques appropriées, le code peut être sûr, mais vous devez toujours vous assurer que lorsque vous copiez dans char [], vous avez des garanties sur la longueur de la chaîne copiée, ou vous vérifiez et gérez les chaînes surdimensionnées de manière élégante. Ne pas le faire est ce qui a donné à la famille de fonctions strcpy la réputation d'être peu sûre.
Comment les modèles peuvent aider à rédiger des tampons de caractères sûrs
En ce qui concerne la sécurité des tampons char [], les modèles peuvent aider, car ils peuvent créer une encapsulation pour gérer la taille du tampon à votre place. Des modèles de ce type sont mis en œuvre, par exemple, par Microsoft pour fournir des remplacements sûrs à strcpy. L'exemple ici est extrait de mon propre code, le vrai code a beaucoup plus de méthodes, mais cela devrait être suffisant pour transmettre l'idée de base :
template <int Size>
class BString
{
char _data[Size];
public:
BString()
{
_data[0]=0;
// note: last character will always stay zero
// if not, overflow occurred
// all constructors should contain last element initialization
// so that it can be verified during destruction
_data[Size-1]=0;
}
const BString &operator = (const char *src)
{
strncpy(_data,src,Size-1);
return *this;
}
operator const char *() const {return _data;}
};
//! overloads that make conversion of C code easier
template <int Size>
inline const BString<Size> & strcpy(BString<Size> &dst, const char *src)
{
return dst = src;
}