如何在c ++中正确清理静态类

时间:2014-10-03 11:34:56

标签: c++ c++11 static-members

我需要一个单例类,因为我只需要初始化一些变量。当我崩溃时无法清理班级时,我遇到了问题。这是我班级的缩减版本:

#include "stdafx.h"
#include <iostream>

class MyClass
{
public:
    MyClass();
    virtual ~MyClass();

    static MyClass& Instance();
    void DoSomething();
};

MyClass::MyClass()
{
    std::cout<<"MyClass constructor"<<std::endl;
    //initialise some stuff here
}

MyClass::~MyClass()
{
    std::cout<<"MyClass destructor"<<std::endl;
    //clean up some stuff here
}

MyClass& MyClass::Instance()
{
    static MyClass _instance;
    return _instance;
}

void MyClass::DoSomething()
{
    std::cout<<"Do something"<<std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    MyClass& myClass = MyClass::Instance();
    myClass.DoSomething();

    delete &myClass;

    return 0;
}

当我调用delete&amp; myClass时,析构函数会被调用,然后它会像这样爆炸:

enter image description here

我已经调查过了,我认为我不应该在一个尚未使用new创建的对象上调用delete。这是正确的吗?

答案是否只是不使用任何删除,让析构函数在超出范围时自动调用(当主要返回时)?

3 个答案:

答案 0 :(得分:6)

  

我不应该在未使用new创建的对象上调用delete。

绝对。它是一个静态对象,将在程序结束时自动销毁。没有必要(也没办法)自己摧毁它。

(注意,作为静态,当Instance()返回时它不会被摧毁。而是在程序结束时从main()返回或调用{{1 }})。

答案 1 :(得分:1)

当静态对象超出范围时,它们将被自动删除,所以不要在静态对象上调用delete而你应该没问题

答案 2 :(得分:1)

您的错误是由于删除(如其他人所述)。

  

我需要一个单例类,因为我只需要初始化一些变量。

不,你真的(真的,真的)没有。单身人士解决了集中价值/设置的问题,同时引入隐藏状态,收紧模块耦合,隐藏模块依赖关系和渲染代码不可测试。

请考虑使用dependency injection