2014-02-19 17 views
-1

之間的差:什麼是什麼以下兩個分配之間的差值的兩個C++分配方法

for (I = 0; I < 10000000; i++) 
    P = new CMyObject; 

而且

P = new CMyOjbect[10000000]; 

將分配在第一分配方法原因多個片段和消耗更多的實際記憶?

+0

第一個指向CMyObject的10000000個新指針,它們在每次迭代結束後立即泄漏。第二個指向10000000個CMyObjects的數組。 – CoryKramer

+3

第一個泄漏了很多內存。不過,兩者都在尋求麻煩。只需使用一個矢量。 – chris

+1

你不能在第一種分配方法中訪問9999999分配的CMyObjects – yizzlez

回答

3

其中一個獨立分配10000000個元素。原則上,這些物品可以散佈在整個虛擬內存空間中。另一個分配一個10000000個連續元素的單個數組。

在第一種情況,你必須單獨調用的每個實例delete(你不能這樣做,所以你有內存泄漏。)在第二種情況下,需要調用delete []P解除分配整個陣列。

+0

這是一個很好的答案,但我不認爲如果這些對象在創建基礎結構之後使用其他類型的內存分配,它確實回答了內存碎片的想法,但很難說不知道對象是什麼。 – Nowayz

0

每個分配會消耗一些時間並使用(我假設這可能是可以避免的)一些額外的內存。所以方法1肯定會變慢,很可能會使用更多的內存,並可能導致更多的碎片。

1

在第一種情況下,您正在分配10000000個對象,但在覆蓋之前分配的對象時,只有最後一個對象可用。 --->內存泄漏

在第二種情況下,您分配一個10000000個對象的數組。您可以刪除那些與

delete [] P; 
+0

非常真實(很好的發現),但我確定用戶意味着P [I] = new CMyObject; - 對於這個問題我的意思是。 –

2

是的。

與每個內存分配相關的開銷取決於操作系統以及代碼是否帶或不帶調試符號。

無論如何,每個分配都有正面的開銷。因此,在一個呼叫分配N個對象的開銷比分配一個對象顯着更少的每N次,特別是當N是10000000

請看下面的代碼:

#include <stdlib.h> 
#include <iostream> 

struct Object 
{ 
    Object() : i(0) {} 
    int i; 
}; 

int N = 1000000; 

void test1() 
{ 
    Object* p = new Object[N]; 
} 

void test2() 
{ 
    for (int i = 0; i != N; ++i) 
     Object* p = new Object; 
} 

int main(int argc, char** argv) 
{ 
    int i = atoi(argv[1]); 
    if (i == 1) 
    { 
     test1(); 
    } 
    else 
    { 
     test2(); 
    } 

    std::cout << "Enter a number: "; 
    std::cin >> i; 
    return 0; 
} 

平臺:cygwin32,編譯器:克++不帶調試符號

 
    Memory used for test1: 4,760K 
    Memory used for test2: 16,492K 

平臺:Windows 7中,64位,編譯器:Visual Studio 2008中不帶調試符號

 
    Memory used for test1: 4,936K 
    Memory used for test2: 16,712K 

平臺:Windows 7中,64位編譯器:Visual Studio 2008的調試符號

 
    Memory used for test1: 5,016K 
    Memory used for test2: 48,132K 

還有額外的簿記有工作要做,以確保分配的內存被釋放。這個練習的要點是僅僅演示兩種分配內存方式的開銷成本。

+1

不,不是,提供一個基準來證實這個 – Nowayz

+0

@Nowayz,我剛剛添加了一些初步的基準。你有什麼理由相信我的結論不適用於某些用例嗎? –

+0

爲什麼第二次分配會消耗更多的內存,因爲在分配了第一個CMyObject之後,第二次分配在第一次CMyObject之後被正確分配,因此我認爲第二個CMyObject只是在第一次之後繼續分配,所以對於第三次一? – alancc

相關問題