kstring(const char* str)
{
size_ = std::strlen(str);
if (size_ + 1 > capacity_)
reserve(capacity_ + 1);
std::strcpy(data(), str);
}
У этого много проблем.
Сначала вы устанавливаете size_
в размере, который будет сразу. Но затем, если вы посмотрите на reserve
, он попытается скопировать size_
байтов того, что уже было в строке.
Во-вторых, сумма, которую вы пытаетесь зарезервировать, составляет capacity_ + 1
. Но нет никаких оснований думать, что этого будет достаточно для хранения строки, которую вы собираетесь скопировать.
Это, вероятно, ближе к тому, что вы хотите:
kstring(const char* str)
{
size_t new_size = std::strlen(str) + 1;
if (new_size > capacity_)
reserve(new_size + 1);
std::strcpy(data(), str);
size_ = new_size - 1;
}
Обратите внимание, что мы не меняем size_
перед вызовом reserve
, поэтому он не будет выходить за пределы. Также обратите внимание, что мы сообщаем reserve
правильное количество байтов, которое нам нужно зарезервировать.