簡體   English   中英

默認動態內存大小

[英]Default dynamic memory size

我有以下代碼:

#include <iostream>`

using namespace std;
int main() {
    char* data = new char;
    cin >> data;
    cout << data << endl;
    return 1;
}

當我輸入26個char*作為字符串文字時,它會編譯並打印它。 但是,當我將27個數據作為數據時,它就會中止。 我想知道為什么。

為什么是27?

它有特殊意義嗎?

你只分配一個角色的空間。 因此,讀取任何數據不僅僅是覆蓋您不擁有的內存,因此這是未定義的行為。 這是你在結果中看到的。

您動態分配一個字節的存儲空間。 要分配倍數,請執行以下操作:

char* data = new char[how_many_bytes];

使用字符串文字時,會自動分配多個堆棧空間。 動態分配時,必須正確獲取字節數,否則會出現段錯誤。

這只是未定義的行為 ,又名“UB”。 該計划可以做任何事情或什么都不做 您看到的任何效果都是不可復制的。

為什么是UB?

因為您為單個char值分配空間,並將其視為以零結尾的字符串 由於零占用一個char值,因此沒有(保證)空間用於實際數據。 但是,由於C ++實現通常不會添加低效的事物檢查,因此您可以放棄將數據存儲在您不擁有的內存部分中 - 直到它崩潰或產生無效結果或由於UB而產生其他不良影響。

要正確執行此操作,請使用std::string而不是char* ,並且不要newdeletestd::string會自動為您執行此操作)。

然后使用std::getline將一行輸入讀入字符串。

您必須在C ++實現的底層查看具體細節。 可能是malloc的實現,等等。 您的代碼寫入緩沖區的末尾,根據C ++標准,它是UB。 要想知道為什么它會像它一樣運行,你需要知道應該存儲在你覆蓋的27或28個字節中的內容,你不應該這樣做。

最有可能的是,27個恰好是您開始破壞內存分配器用於跟蹤已分配和空閑塊的數據結構的點。 但是對於UB,您可能會發現行為不像第一次出現那樣一致。 作為一名C ++程序員,你並沒有真正“有資格”了解這些細節,因為如果你了解它們,那么你可能會開始依賴它們,然后它們可能會在沒有通知的情況下發生變化。

暫無
暫無

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

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