編譯器的堆空間不足
『壹』 c++中為什麼有些變數在編譯是就由編譯器分配了內存空間,還沒有運行怎麼會佔用內存呢
還沒有運行怎麼會佔用內存呢?!(這一點還要懷疑嗎!?)
所謂在編譯期間分配空間指的是靜態分配空間(相對於用new動態申請空間),如全局變數或靜態變數(包括一些復雜類型的常量),它們所需要的空間大小可以明確計算出來,並且不會再改變,因此它們可以直接存放在可執行文件的特定的節里(而且包含初始化的值),程序運行時也是直接將這個節載入到特定的段中,不必在程序運行期間用額外的代碼來產生這些變數。
其實在運行期間再看「變數」這個概念就不再具備編譯期間那麼多的屬性了(諸如名稱,類型,作用域,生存期等等),對應的只是一塊內存(只有首址和大小),所以在運行期間動態申請的空間,是需要額外的代碼維護,以確保不同變數不會混用內存。比如寫new表示有一塊內存已經被佔用了,其它變數就不能再用它了; 寫delete表示這塊內存自由了,可以被其它變數使用了。(通常我們都是通過變數來使用內存的,就編碼而言變數是給內存塊起了個名字,用以區分彼此)
內存申請和釋放時機很重要,過早會丟失數據,過遲會耗費內存。特定情況下編譯器可以幫我們完成這項復雜的工作(增加額外的代碼維護內存空間,實現申請和釋放)。從這個意義上講,局部自動變數也是由編譯器負責分配空間的。進一步講,內存管理用到了我們常常掛在嘴邊的堆和棧這兩種數據結構。
最後對於「編譯器分配空間」這種不嚴謹的說法,你可以理解成編譯期間它為你規劃好了這些變數的內存使用方案,這個方案寫到可執行文件裡面了(該文件中包含若干並非出自你大腦衍生的代碼),直到程序運行時才真正拿出來執行!
『貳』 QT編譯器的堆空間不足是什麼意思
你說的是手機RAM還有3G,手機提示安裝空間不足是指你的手機快閃記憶體不夠了,試著把手機里的應用能轉到手機ROM內存(就是一般說的手機內存)里。試試看行不行。希望能幫到你
『叄』 很多書上面寫,堆空間中的內存如果不釋放掉,就永遠不可被別的變數佔用,那麼這個永遠是指多久
C++編譯器會為每個類自動生成一個默認的構造函數、析構函數、賦值函數、拷貝構造函數,這當然是在你沒有為你的類聲明這些函數的時候。這些默認的功能函數在為你提供方便的時候,也會給你帶來麻煩。
例如:
class string {
public:
string(const char *value);
~string();
... // 沒有拷貝構造函數和operator=
private:
char *data;
};
string::string(const char *value)
{
if (value) {
data = new char[strlen(value) + 1];
strcpy(data, value);
}
else {
data = new char[1];
*data = '\0';
}
}
inline string::~string() //注意:new 和delete 要採用相同的形式。
如果有string的兩個對象,
string a("hello");
string b("world");
當b=a時,因為你自己沒為類定義那些函數,所以C++編譯器會提供默認的賦值函數,這個預設的賦值操作符會執行從a的成員到b的成員的逐個成員的賦值操作,對指針(a.data和b.data) 來說就是逐位拷貝。這種情況下至少有兩個問題。
第一,b曾指向的內存永遠不會被刪除,因而會永遠丟失。這是產生內存泄漏的典型例子。
第二,現在a和b包含的指針指向同一個字元串,那麼只要其中一個離開了它的生存空間,其析構函數就會刪除掉另一個指針還指向的那塊內存,重復析構的問題。
下面的語句:
string a("hello"); // 定義並構造 a
{ // 開一個新的生存空間
string b("world"); // 定義並構造 b
...
b = a; // 執行 operator=, 調用默認賦值函數
// 丟失b的內存,造成內存泄露。
} // 離開生存空間, 調用
// b的析構函數
string c = a; // c.data 的值不能確定! 調用默認的拷貝構造函數
// 但是a.data 已被刪除,無法進行拷貝構造。
『肆』 用c語言隨機生成數據,由於數組規模較大,空間不足,程序無法運行怎麼辦
是有這么一個規定的,堆一次申請,空間大小是2M,受編譯器和操作系統的限制。
如果沒辦法更換系統和編譯器,可以邊申請,邊寫到硬碟上,比如寫入一個文件。
『伍』 程序設計中,堆和棧比較重要。棧存取速度大於堆,而且編譯器可以修改棧大小,這個值可以隨意設置嗎
學習電腦編程多年了,在程序設計方面也算有一番見解,希望這些經驗能對題主有所幫助。
現在堆棧通常默認為8M,對吧?事實上,如果你不濫用遞歸,或者alloca / vla,大多數時候,就足夠了。即使它不超過內核限制,通常也不適合驅動大型的,或者它會影響並發進程的數量。並且過程啟動時間也應該稍微減少。當然,如果是專用的伺服器系統,問題就不嚴重了。
『陸』 VC中堆溢出,請問如何在編譯器中設置堆的大小小
這不是在編譯器里設置的問題.
溢出是因為你在指針中開辟的空間太小.比如你設置了一個數組個數是5,你要往裡面放6個數,就會溢出了.堆棧也是一樣的.可能是你設置不對.仔細檢查一下.
『柒』 請問VC6。0怎中么指定編譯器堆空間大小
Determines the compiler's memory allocation limit for the precompiled header.
/Zmnumber
The number argument is a scaling factor with a default value of 100, which specifies a memory allocation of 50 MB. The maximum value is 2000. The following table shows how number modifies the memory allocation.
Value Memory allocation
10 5.0 MB
100 50 MB
200 100 MB
1000 500 MB
2000 1000 MB
不過這種情況應該是你的演算法有問題吧?
『捌』 為什麼打開電影提示內存不夠編譯器錯誤啊
這是系統提示:
可用內存不足。
錯誤
ID:BC2004
(也就是說,你在播放電影的時候,由於其他進程正在運行,佔用了內存,剩餘資源無法支持電影播放)
防止此情況,你可以試著進行以下操作:
關閉不必要的應用程序、文檔和源文件。
消除不必要的控制項和窗體,以便同一時間載入較少的控制項和窗體。
減少
Public
變數的數目。
檢查可用的磁碟空間。
請通過安裝更多的內存或重新分配內存來增加可用
RAM。
確保不再需要內存時釋放內存。
『玖』 C語言中malloc分配內存空間不足, 但是還是能放,為什麼呢
這說明你比較幸運,沒有出現程序崩潰。
首先在堆棧申請的內存,後面也許還是沒有別的程序在用,所以你的程序超過你申請的內存也不會出現問題;
但是如果有別的程序已經佔用了你申請內存的後面空間,你再用就會出現無法寫入,程序崩潰。
『拾』 「編譯器」如何設置內存區域
不是.
編譯好後的exe文件並非只有代碼部分,還有其他的部分如數據部分以及其他.其中包括諸如內存如何分配,堆棧如何處理等等的描述.而這些描述就是編譯器寫進exe文件里的.
如果想知道的詳細些,可以簡單的看一下關於PE結構的描述~~