我试图创建一个不使用动态内存的自定义字符串类,我正在使用模板数组长度技巧。因为大小作为模板参数传递,所以在编译时就已知。因此,char buffer[n]
不是变长数组。这样想对吗?以下是代码:
template<typename T, size_t n>
class string_test
{
using Type = T;
// Don't count NUL byte
size_t _size = n - 1;
char buffer[n]; // <--- variable length array?
public:
string_test(const char* str)
{
strcpy(buffer, str);
}
size_t size() const
{
return _size;
}
const char* c_str() const
{
return buffer;
}
};
template<typename T, size_t n>
string_test<T, n> make_string(const T (&str)[n])
{
return string_test<T, n>(str);
}
希望通过这种方法所有的内存都在栈上,我不会遇到任何关于new、delete等方面的问题。
buffer
不是可变长度数组(VLA)。 - juanchopanzabasic_string<char,char_traits<char>,YourAllocator>
,其中分配器是基于堆栈的。然后你就可以获得其他所有东西,而不必重写所有代码。http://en.cppreference.com/w/cpp/string/basic_string - PaulMcKenziestring_test<char, 0>
- 它将尝试分配数千兆字节 :-) 此外,您的strcopy
不安全,因为它也会复制空字节,而您没有足够的空间来存储它(在一般情况下也不安全,因为传入的字符串可能比n
更长)。 - Cameronsize_t
,也就是无符号类型。OP正在从中减去1。如果你从一个无符号的0中减去1,它会绕回到该类型可以容纳的最大值(所有1位)。炸了! :-) - Cameron