首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态分配内存释放

静态分配内存释放
EN

Stack Overflow用户
提问于 2013-08-27 13:32:35
回答 3查看 194关注 0票数 2

我有一个单例类,如下所示:

代码语言:javascript
复制
class myClass
{
public:
    static myClass* getInstance();
    ~myClass();

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

上面的类定义是:

代码语言:javascript
复制
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()中。

EN

回答 3

Stack Overflow用户

发布于 2013-08-27 13:38:14

您可以使用智能指针而不是原始指针,这样您就不必考虑它:)

如果你使用的是C++11,你可以使用unique_ptr。如果您使用的是比auto_ptr更旧的编译器。

另外,上面的代码不是线程安全的。

票数 1
EN

Stack Overflow用户

发布于 2013-08-27 13:38:37

如果对象一直存在到程序关闭,则不必释放它。但是,您可能希望释放资源(文件、套接字、数据库连接等)。在关闭时由单例保持;您可以使用在正常程序关闭期间调用的静态“反初始化”函数来执行此操作。

顺便说一句,初始化单例的方式不是threadsafe。您可能希望改用threadsafe singleton

票数 1
EN

Stack Overflow用户

发布于 2013-08-27 13:39:26

在这种情况下,您必须使用main中的指针(或在它超出作用域之前可以访问它的任何地方)删除对象。

类似于:

代码语言:javascript
复制
int main()
{
    myClass* inst = myClass::getInstance();
    // ... do something with it here
    delete inst;
}

尽管这通常是一种糟糕的做法,因为您不应该在程序中的任何地方有一个new/delete“狂野运行”。最好坚持RAII概念,并使用构造函数和析构函数将堆存储的内存与堆栈上的一些对象绑定在一起。

在这个特定的例子中,不用在"getInstance()“中使用"new mClass”,只需将m_instance声明为static即可。

代码语言:javascript
复制
myClass& myClass::getInstance()
{
    static myClass instance;
    return instance;
}

通过这种方式,你根本不需要释放任何内存,因为它将与你程序中的所有其他静态内存一起自动释放。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18457682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档