静态分配内存释放
Static allocated memory release
我有一个单例类,如下所示:
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()
中,直到应用程序关闭。
您可以使用智能指针而不是原始指针,然后无需考虑:)
如果您使用的是C++11,则可以使用unique_ptr。如果您使用的是比auto_ptr
更旧的编译器。
此外,上面的代码不是线程安全的。
如果对象在程序关闭之前一直存在,则不一定要释放它。但是,您可能希望在关闭时释放singleton所拥有的资源(文件、套接字、数据库连接等);您可以使用在正常程序关闭期间调用的静态"去初始化"函数来完成此操作。
顺便说一句,初始化单例的方式不是线程安全的。您可能需要使用线程安全的singleton。
在这种情况下,您必须使用main中的指针删除对象(或者在对象超出范围之前可以访问它的任何位置)。
类似于:
int main()
{
myClass* inst = myClass::getInstance();
// ... do something with it here
delete inst;
}
尽管这通常是一种糟糕的做法,因为你的程序中不应该有一个新的/删除的"疯狂运行"。最好坚持RAII的概念,并使用构造函数和析构函数将堆存储的内存与堆栈上的一些对象绑定。
在这种特定情况下,您可以将m_instance声明为static,而不是在"getInstance()"中使用"new mClass"。
myClass& myClass::getInstance()
{
static myClass instance;
return instance;
}
通过这种方式,您根本不必释放任何内存,因为它将与程序中的所有其他静态信息一起自动释放。
相关文章:
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?