Sử dụng chuỗi thô
Vâng, đôi khi bạn thực sự có thể làm điều này. Khi sử dụng const char *, các mảng char được cấp phát trên ngăn xếp và các ký tự chuỗi, bạn có thể thực hiện theo cách không có cấp phát bộ nhớ nào cả.
Viết mã như vậy thường đòi hỏi nhiều suy nghĩ và cẩn thận hơn so với sử dụng chuỗi hoặc vector, nhưng với một kỹ thuật thích hợp, nó có thể được thực hiện. Với các kỹ thuật thích hợp, mã có thể an toàn, nhưng bạn luôn cần đảm bảo rằng khi sao chép vào char [], bạn có một số đảm bảo về độ dài của chuỗi được sao chép hoặc bạn kiểm tra và xử lý các chuỗi quá khổ một cách khéo léo. Không làm như vậy là điều khiến họ hàm strcpy có tiếng là không an toàn.
Cách các mẫu có thể giúp viết bộ đệm ký tự an toàn
Về độ an toàn của bộ đệm char [], các mẫu có thể giúp ích, vì chúng có thể tạo ra một gói để xử lý kích thước bộ đệm cho bạn. Các mẫu như thế này được Microsoft triển khai, ví dụ như để cung cấp các thay thế an toàn cho strcpy. Ví dụ ở đây được trích xuất từ mã của riêng tôi, mã thực có nhiều phương thức hơn, nhưng điều này đủ để truyền đạt ý tưởng cơ bản:
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;
}