這不是一個關於爲什麼要編寫這樣的代碼的問題,而更多的是關於如何執行一個方法與它綁定的對象有關的問題。如果對象調整其自己的容器,會發生什麼情況?
如果我有一個像結構:
struct F
{
// some member variables
void doSomething(std::vector<F>& vec)
{
// do some stuff
vec.push_back(F());
// do some more stuff
}
}
我用它是這樣的:
std::vector<F>(10) vec;
vec[0].doSomething(vec);
發生什麼情況,如果在doSomething(...)
的push_back(...)
導致矢量擴展?這意味着vec[0]
將被複制,然後在執行其方法的過程中被刪除。這不會有好處。
有人可以解釋究竟發生了什麼嗎?
- 程序是否會立即崩潰?該方法是否試圖對不存在的數據進行操作?
- 該方法是否在對象的「孤立」中運行,直至遇到像更改對象狀態一樣的問題?
我感興趣的是方法調用與關聯對象的關係。
感謝您的答案。您是否認爲該計劃可能會繼續進行而不會崩潰?如果我將數組的邊界寫入空閒內存,則會被檢測到。什麼可以讓一種方法能夠毫無問題地寫入空閒內存? – user487100
您幾乎可以永久寫入「釋放」的內存而不會崩潰。這就是內存映射的工作方式。地圖保持原位以供將來的物體使用。但是,您可以**從不**寫入已釋放的內存「沒有問題」。只是「問題」不是崩潰。 –
@ user487100:如果您將數組的邊界寫入空閒內存,則會檢測到_sometimes_。製作一個案例我可以很容易地寫下來,但是我可以寫出超過最後的結果,而不是一段時間內檢測出來。分配一個'char * a = new char [1]',然後讀寫'a [1]',它可能不會在大多數系統上觸發任何錯誤。 –