c++ Delete[]在VS 2013中给出错误

C++ Delete[] giving error in VS 2013

本文关键字:出错 错误 2013 VS Delete c++      更新时间:2023-10-16

我试图删除一个' 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++的新手,我正在尝试学习删除操作符,它不太好:/

我不支持在这种情况下使用newdelete,但是要指出您的错误,您正在删除不通过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);
const char * c = str.c_str();
delete[] c; // Gives error.

c是指向str的内容的指针,仍然由str对象本身拥有和管理,可能不会动态分配(例如,它可能是指向str对象内部的短字符串优化缓冲区的指针),更不用说new[]了,即使它恰好是str对象,当它超出范围或出于任何原因将数据复制到更大的缓冲区时,它也会做delete[]。总之,在调用c_str()之后,您可以使用指针,直到str对象被调整大小或"销毁",但不需要自己做任何清理。


查看剩余的代码…

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,可能应该在某个地方,一段时间后,它不再需要。

也就是说,您可以使用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));

不需要删除c,它只是一个指向数组(包含以null结尾的"str"字符序列)的指针。

数组仍然存储在变量"str"中。

相关文章: