2011-03-29 33 views
0

我正在學習C++和下面的代碼,我不知道如果我不刪除* p,會減少多少內存。使用DELETE來節省內存,可以有人證明

#include <iostream> 
using namespace std; 

int *getPtrToFive() 
{ 
    int *x = new int; 
    *x = 5; 
    return x; 
} 


int main() 
{ 
    int *p = getPtrToFive(); 
    cout << *p << endl; 
    delete p; // ????????????? 
} 

如何驗證或演示它。我正在使用Visual Studio 2008 Express。希望我的IDE能立即展示結果。

乾杯,

+0

迂腐來說,留下的是刪除不會泄漏,因爲程序後立即退出,過程被殺害。你在堆上分配的內存屬於你的進程的工作集,而當進程結束時,內存就會變得臃腫。但是,做這樣的事情通常會被認爲是最糟糕的風格(如果沒有其他原因,那麼因爲析構函數不會運行)。請妥善刪除您分配的內容,無論事實上是否泄漏。 – Damon 2011-03-29 22:25:31

回答

8

考慮到在調試模式下構建在Visual C++ 2010下面的示例,它將是字節泄漏。如果發現任何問題,CRT能夠傾倒泄漏。 (即不重新分配免費存儲所獲取的資源)

#define _CRTDBG_MAP_ALLOC 

#include <crtdbg.h> 

int main() 
{ 

    int *rawPtr = new int(100) ; 
    // Purposefully not deallocating the rawPtr owned resources from free store 
    _CrtDumpMemoryLeaks() ; 
    return 0; 

} 

輸出:

...
檢測內存泄漏!
轉儲對象 - >
{56} 0x006C3250的正常塊,4個字節長。
數據:< 2> 32 00 00 00
對象轉儲完成。
程序'[6160] memoryLeaks.exe:Native'已退出,代碼爲0(0x0)。


使用std::auto_ptr來處理原始指針。如果他們超出範圍,他們能夠有效地釋放擁有的資源。

例:

void foo() 
{ 

    int *rawPtr = new int(100) ; 
    std::auto_ptr<int> safePtr(rawPtr) ; 
    // Now no need to use delete statement 

} // safePtr out of scope => deallocates the resource it owned safely 
    // No memory leak 
3

這是一個奇怪的問題。

那麼在這種情況下,它是一個int,所以通過不清理它,你大概會浪費4個字節的內存加上操作系統的開銷。如果您運行的是高性能應用程序或遊戲,則不希望每幀都會經常丟失內存,也稱爲內存泄漏。

如果這是一個簡單的應用程序,並且不是連續分配內存,那麼這個問題並不是太大,因爲當程序關閉時,操作系統應該清理程序內存。再次,不要以恆定的速度泄漏內存,你應該沒問題。

0

有兩個部分是:

  1. 在這個應用中,你是在浪費沒有記憶,因爲一旦你的應用程序終止,主要完成後,所有的內存由OS清理 - 所以實際上沒有真正的泄漏。

  2. 假設應用程序中存在更多的內存泄露量取決於您使用新分配的內存量,並且int這種情況是無論您的平臺的int大小是多少。

4

由於以下原因,此程序不會像您所希望的那樣具有示範性。當程序終止時(也就是說,當「main」函數返回時)程序使用的所有內存,無論它是分配在堆還是堆棧上,都會返回到操作系統。

因此,儘管從技術上講,程序通過在相應的「新」之後不執行「刪除」而泄漏內存,但該內存僅在程序生命期間泄漏,在本示例中不是很長。

相關問題