Verwendung von Rohzeichenfolgen
Ja, manchmal kann man das wirklich. Wenn Sie const char *, char-Arrays, die auf dem Stack zugewiesen sind, und String-Literale verwenden, können Sie dies so tun, dass überhaupt keine Speicherzuweisung erfolgt.
Das Schreiben eines solchen Codes erfordert oft mehr Nachdenken und Sorgfalt als die Verwendung von Zeichenfolgen oder Vektoren, kann jedoch mit geeigneten Techniken durchgeführt werden. Mit den richtigen Techniken kann der Code sicher sein, aber Sie müssen immer sicherstellen, dass Sie beim Kopieren in char [] entweder einige Garantien für die Länge der zu kopierenden Zeichenfolge haben oder dass Sie übergroße Zeichenfolgen ordnungsgemäß prüfen und handhaben. Wenn Sie dies nicht tun, hat die strcpy-Funktionsfamilie den Ruf, unsicher zu sein.
Wie Vorlagen beim Schreiben sicherer Zeichenpuffer helfen können
In Bezug auf die Sicherheit von char [] -Puffern können Vorlagen hilfreich sein, da sie eine Kapselung für die Behandlung der Puffergröße für Sie erstellen können. Vorlagen wie diese werden z. B. von Microsoft implementiert, um strcpy sicher zu ersetzen. Das Beispiel hier ist aus meinem eigenen Code extrahiert, der echte Code hat viel mehr Methoden, aber dies sollte ausreichen, um die Grundidee zu vermitteln:
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;
}