2012-06-21 38 views
0

我有以下代碼:默認動態存儲器大小

#include <iostream>` 

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

當我在26 char*一者作爲字符串文字,它編譯並打印類型。但是當我做27個數據時,它會中止。我想知道爲什麼。

爲什麼是27?

它對它有特殊的意義嗎?

+0

請勿使用反引號代碼。使用ctrl-K或其他格式化工具。 – Joe

回答

0

你必須在C++實現的引擎下查看具體細節。大概執行malloc等等。您的代碼按照C++標準寫入緩衝區的末尾,即UB。要想知道爲什麼它的行爲如此,你需要知道你應該將27或28字節中存儲的內容存儲在你重寫的內容中,而不應該這樣做。

最有可能的是,27個恰好是你開始破壞內存分配器用來跟蹤分配和空閒塊的數據結構的地方。但是對於UB,你可能會發現這種行爲並不像它第一次出現那樣一致。作爲一名C++程序員,你並不真正有權知道這些細節,因爲如果你知道他們,那麼你可能會開始依賴他們,然後他們可能會改變,恕不另行通知。

2

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

0

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

char* data = new char[how_many_bytes]; 

當您使用字符串文字時,將自動分配多少堆棧空間。當你動態地分配時,你必須得到正確的字節數,否則你會得到一個段錯誤。

0

這只是未定義的行爲,又名「UB」。該計劃可以做任何事情或什麼都不做您看到的任何效果都不可重現。

爲什麼是UB?

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

爲了正確地做到這一點,使用std::string代替char*,也不要newdelete(一std::string這是否自動爲您)。

然後使用std::getline來讀取字符串中的一行輸入。