2013-08-27 75 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; 
} 

这样你就不必释放任何内存在所有的,因为它会在你的程序中的所有其他静态发布的汽车。