[英]Memory management in C++.
我有以下程序:
//simple array memory test.
#include <iostream>
using namespace std;
void someFunc(float*, int, int);
int main() {
int convert = 2;
float *arr = new float[17];
for(int i = 0; i < 17; i++) {
arr[i] = 1.0;
}
someFunc(arr, 17, convert);
for(int i = 0; i < 17; i++) {
cout << arr[i] << endl;
}
return 0;
}
void someFunc(float *arr, int num, int flag) {
if(flag) {
delete []arr;
}
}
當我將以下內容放入gdb
並在float *arr ...
插入一個斷點時,我逐步執行該程序並觀察以下內容:
arr
初始化后打印陣列給我1 17次。 someFunc
里面,我在delete
之前打印arr
以獲得與上面相同的打印。 main
,當我打印arr
,我得到第一個數字為0,然后是16個1.0s。 我的問題:
1.在someFunc
刪除數組someFunc
,如何在someFunc
或main
沒有段錯誤的情況下仍能訪問arr
?
2.上面的代碼片段是在更大的程序中運行的另一段代碼的測試版本。 我在兩個地方觀察到相同的行為(第一個數字是0
但是所有其他數字都是相同的。如果這是一些無法解釋的記憶錯誤,我如何在不同的區域觀察同樣的事情?
我們非常歡迎一些解釋來填補我理解中的空白。
當您訪問未映射到進程的內存地址時,會發生段錯誤。 調用delete []
會將內存釋放回內存分配器,但通常不會釋放到操作系統。
調用delete []
之后內存的內容是一個實現細節,它在編譯器,庫,操作系統以及特別是調試版與發行版之間有所不同。 例如,調試內存分配器通常會為內存填充一些像0xdeadbeef這樣的告密簽名。
在delete
指針后取消引用指針是未定義的行為,這意味着任何事情都可能發生。
刪除數組后,對它的任何訪問都是未定義的行為。 我們無法保證您會收到違規行為; 事實上,通常你不會。 但是不能保證你會得到什么; 在較大的程序中,修改數組的內容很容易導致其他地方的內存損壞。
delete
將內存返回給OS內存管理器,但不一定清除內存中的內容(它不應該,因為它會導致無任何開銷)。 因此值保留在內存中。 在你的情況下,你正在訪問相同的內存 - 所以它將打印內存中的內容 - 它不一定是未定義的行為(取決於內存管理器)
回復1:你做不到。 如果您想稍后訪問arr,請不要刪除它。
C ++不檢查數組邊界。 只有當您訪問不允許的內存時,才會出現段錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.