簡體   English   中英

C ++中的內存管理。

[英]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 ...插入一個斷點時,我逐步執行該程序並觀察以下內容:

  1. arr初始化后打印陣列給我1 17次。
  2. someFunc里面,我在delete之前打印arr以獲得與上面相同的打印。
  3. 回到main ,當我打印arr ,我得到第一個數字為0,然后是16個1.0s。

我的問題:
1.在someFunc刪除數組someFunc ,如何在someFuncmain沒有段錯誤的情況下仍能訪問arr
2.上面的代碼片段是在更大的程序中運行的另一段代碼的測試版本。 我在兩個地方觀察到相同的行為(第一個數字是0但是所有其他數字都是相同的。如果這是一些無法解釋的記憶錯誤,我如何在不同的區域觀察同樣的事情?
我們非常歡迎一些解釋來填補我理解中的空白。

當您訪問未映射到進程的內存地址時,會發生段錯誤。 調用delete []會將內存釋放回內存分配器,但通常不會釋放到操作系統。

調用delete []之后內存的內容是一個實現細節,它在編譯器,庫,操作系統以及特別是調試版與發行版之間有所不同。 例如,調試內存分配器通常會為內存填充一些像0xdeadbeef這樣的告密簽名。

delete指針后取消引用指針是未定義的行為,這意味着任何事情都可能發生。

刪除數組后,對它的任何訪問都是未定義的行為。 我們無法保證您會收到違規行為; 事實上,通常你不會。 但是不能保證你會得到什么; 在較大的程序中,修改數組的內容很容易導致其他地方的內存損壞。

delete將內存返回給OS內存管理器,但不一定清除內存中的內容(它不應該,因為它會導致無任何開銷)。 因此值保留在內存中。 在你的情況下,你正在訪問相同的內存 - 所以它將打印內存中的內容 - 它不一定是未定義的行為(取決於內存管理器)

回復1:你做不到。 如果您想稍后訪問arr,請不要刪除它。

C ++不檢查數組邊界。 只有當您訪問不允許的內存時,才會出現段錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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