我想删除一个`const char *
int len = str.length();
const char * c = str.c_str();
unsigned short * s = new unsigned short[len];
for (int i = 0; i < len; i++) {
s[i] = c[i] - '0'; // I dislike this cheat
}
delete[] c; // Gives error.
删除后, c
也不会被使用。
我是C ++的新手,我正在尝试学习删除操作符并且它不是很好:/
答案 0 :(得分:4)
我不支持在这类情况下使用new
和delete
,但要指出您的错误,您要删除未通过new
分配的内存。
你可能想写delete[] s;
(因为s
是通过new[]
)
此外,s
可以轻松成为std::vector<unsigned short>
:
// Initializes a vector of unsigned shorts with a specified size.
std::vector<unsigned short> s(len);
答案 1 :(得分:2)
const char * c = str.c_str();
delete[] c; // Gives error.
c
是指向str
对象本身仍然拥有和管理的str
内容的指针,可能无法动态分配(例如,它可能是指向str
对象内部的短字符串优化缓冲区的指针,更不用说new[]
,即使它恰好是str
对象,也会执行delete[]
时它超出了范围或者由于某种原因将数据复制到更大的缓冲区。总而言之,在调用c_str()
之后,您可以使用指针直到调整str
对象的大小或“#34;”#34;,但不需要自己进行任何清理。 / p>
查看其余代码......
int len = str.length();
const char * c = str.c_str();
unsigned short * s = new unsigned short[len];
for (int i = 0; i < len; i++) {
s[i] = c[i] - '0'; // I dislike this cheat
}
delete[] c; // Gives error.
...唯一的错误本身就是你delete[] c
,但你不是delete[] s
,可能应该在某个地方,不再需要它之后的某个时间。< / p>
也就是说,您可以使用std::vector
来存储这样的ASCII代码(对于C ++ 11):
std::vector<unsigned short> s;
for (char c : str)
s.push_back(c - '0');
如果你没有C ++ 11,那么:
for (int i = 0; i < str.length(); ++i)
s.push_back(c[i] - '0');
...或者如果您想尝试迭代器 ...
std::vector<unsigned short> s;
for (std::string::const_iterator i = str.begin(); i != str.end(); ++i)
s.push_back(*i - '0');
您也可以将std::copy
与插入器一起使用,更具声明性,但有点过分恕我直言:
std::copy(str.begin(), str.end(), std::back_inserter(s));
答案 2 :(得分:1)
无需删除c,它只是一个指向数组的指针(包含以空格终止的“str”字符序列)。
数组仍存储在变量“str”中。