C ++删除[]在VS 2013中给出错误

时间:2014-07-14 03:33:42

标签: c++ visual-studio-2013 delete-operator

我想删除一个`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 ++的新手,我正在尝试学习删除操作符并且它不是很好:/

3 个答案:

答案 0 :(得分:4)

我不支持在这类情况下使用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);

答案 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”中。