2014-12-05 68 views
0

C++:對象可以被更早地銷燬,以使其存儲內存被後續對象重用嗎?對象是否可以被更早的銷燬,以使其存儲內存可以被後續對象重用?

在C++代碼一個段,在所述第一半部分,一個對象,使用B; 在下半部分,創建和使用對象c,d。

由於物體A,B佔用大量的內存,我想手動銷燬對象A,B上半年部分結束的時候。

我知道我可以使用新的,刪除去實現它。

但是,如果我不使用新的,但還是要銷燬對象較早(這意味着,範圍的結束時間之前),我可以手動調用析構函數摧毀它?所以這部分內存可以重用於對象c和d。 (我不需要來釋放內存,因爲重用是罰款

下面是一個僞代碼:。

monsterClass a, b; 
dragonClass c, d; 
int i,j,k,l; 

a = monsterClass(1000, 2000); 
b = monsterClass(2000, 3000); 
i = processMethod1(a, b); 
j = ...; 
k = ...; 
l = ...; 


// here, I want to destroy a, b, since they are not used any more, while occupy memory. 
// The above half part and the below half part use many common variables. 
// So it seems scope {} method makes it inconvenient, 
// since I don't want to create a function with too many parameters. 
// I don't want to use new or delete here. I hope it looks simple and not prone to error 
// So can I use: ~a, ~b here? 

c = dragonClass(400, 3000); 
d = dragonClass(500, 4000); 
processMethod2(c, d, i); 
j = ...; 
k = ...; 
l = ...; 

[更新1]所以,大多數人建議使用範圍,這是一個很好的方式 我還是很好奇,我可以使用〜a和〜b嗎? 我覺得這似乎是一種可行和方便的方式。

[Update 2]我想到了另一種情況,在這種情況下,不同變量的作用域是交織在一起的!就像這樣:a的範圍有b的作用域的重疊,但它們不包括關係。它是部分重疊的關係。 在這種情況下,這是否意味着使用範圍是不可能的? 最後的手段是使用新的和刪除,對吧?

+0

請添加代碼的例子來解釋爲什麼你必須銷燬對象_before scope_其結束的時間。你總是可以添加額外的'{}'來定義更小的範圍。 – timrau 2014-12-05 17:03:07

+1

[您可以手動調用原始對象的析構函數,然後使用放置'new'在該內存之上創建一個新對象](http://stackoverflow.com/questions/2494471/c-is-it-可能對呼叫一個構造函數 - 直沒有新)。如果你這樣做,清楚地記錄事情,因爲它可能會嚴重混淆/誤導代碼的讀者。 – Cornstalks 2014-12-05 17:04:16

+0

你能否將這兩個部分作爲單獨的功能實現?或在一個函數內單獨的塊?這比手動控制要簡單得多(儘管如果你真的需要的話,這在某種程度上是可能的)。 – 2014-12-05 17:09:01

回答

1

通過使用大括號可以手動控制堆棧中對象的生存期。

void foo() 
{ 
    int x = 5; 
    int y = 2; 

    {   // This introduces a new scope 
    int z = 3; 
    }   // After this brace, z is now out of scope 

    int a = x + y; 
} 

但是請注意,一旦變量超出範圍,當再次使用此內存時未指定。僅僅因爲我宣佈了名爲a的另一個int,並不意味着它將被分配到以前的地址z

+0

我不在乎新變量是否完全利用舊變量的內存。但我希望編譯器足夠聰明,可以使用廢棄變量的內存。現代編譯器是這樣嗎? – user1914692 2014-12-05 17:22:45

+0

是的,一旦變量超出範圍,使用我展示的方法或Mike或erenon的解決方案,該內存就可以免費用於某些其他對象。我只是想確保你知道那個特定的位置不一定會立即被重用。 – CoryKramer 2014-12-05 17:24:42

3

使用佈局新和手動調用析構函數:

{ 
    char memory[std::max(sizeof(A),sizeof(B))]; 

    A* pA = new (memory) A(); 
    // use `pA` 
    pA->~A(); // destruct A 

    B* pB = new (memory) B(); 
    // use `pB` 
    pB->~B(); // destruct B 
} // `memory` goes out of scope 

我建議閱讀的新運營商這個優秀的資源:http://en.cppreference.com/w/cpp/language/new

+0

這聽起來有點複雜。我希望使用一個簡單的。 – user1914692 2014-12-05 17:23:11

2

你可以把它分解成更小的功能:

void part1() { 
    monsterClass a, b; 
    a = monsterClass(1000, 2000); 
    b = monsterClass(2000, 3000); 

    processMethod1(a, b); 
} 

或塊內的較大函數

{ 
    monsterClass a, b; 
    // and so on 
} 
{ 
    dragonClass c, d; 
    // and so on 
} 

或使用的臨時

processMethod1(
    monsterClass(1000, 2000); 
    monsterClass(2000, 3000); 
); 

如果你正在做的事情很複雜,這些都不是合適的,你可以用工會,或放置新陷入混亂;細節會很煩瑣,具體取決於你奇怪的要求是什麼。

+0

上面的半部分和下面的半部分使用了許多共同的變量。所以它看起來範圍{}方法使它很不方便,因爲我不想創建一個參數太多的函數。我更願意使用手動管理它。可能嗎? – user1914692 2014-12-05 17:21:28

+0

@ user1914692:我不認爲這會使它特別不方便。你必須在內部塊之外聲明公共變量;或者可能將它們包裝在一個類中,並將其傳遞給函數。正如我所說的那樣,手工管理可能有工會或職位 - 新的可能;但很煩瑣,而且要看你的奇怪要求的細節。在訴諸這種古怪之前,我會努力使用傳統的示波器。 – 2014-12-05 17:25:19

+0

你是對的。你的答案類似於timrau的答案。我可以將常用變量放在這些塊之外。 – user1914692 2014-12-05 17:31:23

1

由於您的代碼段,你可以寫爲

int i,j,k,l; 

{ 
    monsterClass a(1000, 2000); 
    monsterClass b(2000, 3000); 
    i = processMethod1(a, b); 
    j = ...; 
    k = ...; 
    l = ...; 
} 

// here, you want to destroy a, b, since they are not used any more, while occupy memory. 

dragonClass c(400, 3000); 
dragonClass d(500, 4000); 
processMethod2(c, d, i); 
j = ...; 
k = ...; 
l = ...; 

// you could use the same technique if there are still e, f or so 
+0

謝謝。我想到另一種情況。在這種情況下,不同變量的範圍是交織在一起的!就像這樣:a的範圍有b的範圍的重疊,但是它們不包括關係。它是部分重疊的關係。在這種情況下,最後的手段是使用新的和刪除,對嗎? – user1914692 2014-12-05 20:42:17

+0

@ user1914692肯定。 – timrau 2014-12-06 03:15:59

相關問題