2013-08-27 152 views
2

我有一個單獨的類,如下所示:靜態分配的內存釋放

class myClass 
{ 
public: 
    static myClass* getInstance(); 
    ~myClass(); 

private: 
    static myClass* m_instance; 
protected: 
    myClass(); 
}; 

和上面的類定義是:

myClass* myClass::m_instance = 0; 

myClass::myClass() 
{ 
} 

myClass::~myClass() 
{ 
} 

myClass* myClass::getInstance() 
{ 
    if(m_instance == 0) 
    m_instance = new myClass; 
    return m_instance; 
} 

,因爲它是已知的,一旦內存與new分配,它應該被釋放到堆以防止內存泄漏。在我的情況下,我已經分配了與析構函數無關的內存,因爲它是靜態的。 那麼,我該如何釋放內存分配?我應該釋放它嗎?這不會導致內存泄漏,因爲我也有其他類的對象在main()中運行?

PS:getInstance()方法返回的對象存在於main()中,直到關閉應用程序爲止。

+0

或者你可以註冊一個函數到'atexit()'函數。 –

+1

假設你正在爲每個進程提供單獨的內存空間的操作系統上運行(即近期任何現代操作系統),這種情況下的「內存泄漏」是無足輕重的,因爲在main()返回之後,所有內存無論如何由操作系統回收的進程分配。只有〜myClass()需要在進程空間之外做一些清理工作(例如,從/ tmp或其他東西中刪除一個文件),唯一的區別就是可能會有所不同。假設情況並非如此,最簡單的解決方案就是忽略問題,因爲它不會造成任何問題。 –

回答

1

你可以使用一個智能指針代替裸指針,然後你不必去想它:)

如果您正在使用C++ 11可以使用unique_ptr。如果您使用的編譯器比使用auto_ptr舊。

另外,上面的代碼不是線程安全的。

+0

我正在使用Qt我有共享指針和其他智能指針在我的處置。 – elgolondrino

1

如果對象一直存在,直到程序關閉,則不一定要釋放它。但是,您可能希望在關閉時釋放由單例持有的資源(文件,套接字,數據庫連接等);您可以使用在正常程序關閉期間調用的靜態「取消初始化」功能來執行此操作。

順便說一下,初始化單例的方式不是線程安全的。您可能需要改用threadsafe singleton

1

在這種情況下,您將不得不使用main中的指針(或在超出範圍之前訪問它的任何位置)刪除對象。

喜歡的東西:

int main() 
{ 
    myClass* inst = myClass::getInstance(); 
    // ... do something with it here 
    delete inst; 
} 

雖然這通常是一個不好的做法,因爲你不應該有一個新的/刪除程序中的任何地方「猖獗」。最好堅持使用RAII概念,並使用構造函數和析構函數將堆內存中的某些對象綁定到堆棧上。

在這種特殊情況下,您可以將m_instance聲明爲靜態,而不是在「getInstance()」中使用「new mClass」。

myClass& myClass::getInstance() 
{ 
    static myClass instance; 
    return instance; 
} 

這樣你就不必釋放任何內存在所有的,因爲它會在你的程序中的所有其他靜態發佈的汽車。