strcpy的代碼是不安全的,因爲它會嘗試複製分配的內存以外的指針。例如:
int main()
{
const char* s1 = "hello"; // allocated space for 6 characters
char* s2 = new char[ 2 ]; // allocated space for 2 characters.
strcpy(s2, s1);
cout << s2 << endl;
char c; cin >> c;
return 0;
}
此打印正確的價值「你好」,但請記住,指針S2被分配到只有2個字符空間。所以我們可以假設其他字符被寫入隨後的內存插槽,這是不安全的,因爲我們可能覆蓋數據或訪問無效內存。
考慮這樣的解決方案:
char* e4_strdup(const char*& c)
{
// holds the number of space required for the c-string
unsigned int sz{ 0 };
// since c-style strings are terminated by the '\0' character,
// increase the required space until we've found a '\0' character.
for (const char* p_to_c = c; *p_to_c != '\0'; ++p_to_c)
++sz;
// allocate correct amount of space for copy.
// we do ++sz during allocation because we must provide enough space for the '\0' character.
char* c_copy{ new char[ ++sz ] }; // extra space for '\0' character.
for (unsigned int i{ 0 }; i < sz; ++i)
c_copy[ i ] = c[ i ]; // copy every character onto allocated memory
return c_copy;
}
的新運營商仍然會返回一個std :: bad_alloc異常,如果你耗盡內存。
感謝您的回答!我想我明白了。但是這個問題是故意設計的,以便讓讀者分配空間。所以他們可以獲得動態分配的感覺。它位於名爲動態內存管理的章節之下。 – 2015-03-25 00:25:08
@宗耀進:是的,這很好,而且是一個完全合理的學習。然而不幸的是,大多數書籍似乎並沒有對動態內存管理進行足夠詳細的介紹,因此非常有用。 – 2015-03-25 00:26:40
再次感謝您的補充!我懂了。我知道它幾乎不會發生,尤其是像我這樣的新程序員。這只是關於安全問題,並沒有提到爲什麼「新」是一個更好的策略。所以,我對此很好奇。無論如何,非常感謝你! – 2015-03-25 00:28:30