2012-04-22 65 views
2

經過大量的挖掘和搜索,我發現了我的問題的根源。本質上這個代碼被執行,並且在它自己的項目中它會導致相同的錯誤。我發現我無法將智能指針重置爲新的字符串......但是爲什麼?還有一個簡單的方法呢?boost :: scoped_array上的_BLOCK_TYPE_IS_VALID錯誤:

scoped_array<char> sptr; 
char* nptr = "Hello"; 

sptr.reset(""); 
sptr.reset(nptr); 

編輯 -

我想我已經想通了。在重置時,智能指針試圖刪除並清空字符數組(「」),由於沒有使用新操作符,因此未分配到堆上(ahem !!?!!?!???!?!)。因此,當程序試圖釋放內存時,這個程序會崩潰。所以糾正我,如果我錯了,但字符串本身會存儲在程序的可執行字節流本身?如果是這樣,僅供將來參考,是否有強制分配新字符串的方法?

回答

0

您在識別錯誤​​時是正確的。 scoped_array將在其所持的對象上調用delete[];畢竟,這是它存在的唯一目的。你不能delete[]東西不是new[]'d,或者你得到未定義的行爲。

但是,如果您需要動態字符串,則應該只使用std::string。您嘗試創建的任何內容允許scoped_array<char>像字符串一樣行事,最終會成爲劣質版本std::string。然後就像這樣簡單:std::string s; s = ""; s = "Hello"