簡體   English   中英

C ++ Delete []在VS 2013中給出錯誤

[英]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運算符,但操作不太順利:/

在這種情況下,我不支持使用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對象恰好超出范圍或出於任何原因將數據復制到更大的緩沖區時,即使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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM