[英]C++ Delete[] giving error in VS 2013
我正在嘗試刪除`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 ++的新手,正在嘗試學習delete運算符,但操作不太順利:/
在這種情況下,我不支持使用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);
const char * c = str.c_str();
delete[] c; // Gives error.
c
是一個指向的內容str
是仍然擁有和管理的str
對象本身,可能無法動態分配(例如,它可能是一個指向一個簡短的字符串優化緩沖區內的str
對象),更不用說new[]
,即使str
對象恰好超出范圍或出於任何原因將數據復制到更大的緩沖區時,即使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,它只是一個指向數組的指針(該數組包含以空終止的“ str”字符序列)。
該數組仍存儲在變量“ str”中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.