我需要一个单例类,因为我只需要初始化一些变量。当我崩溃时无法清理班级时,我遇到了问题。这是我班级的缩减版本:
#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时,析构函数会被调用,然后它会像这样爆炸:
我已经调查过了,我认为我不应该在一个尚未使用new创建的对象上调用delete。这是正确的吗?
答案是否只是不使用任何删除,让析构函数在超出范围时自动调用(当主要返回时)?
答案 0 :(得分:6)
我不应该在未使用new创建的对象上调用delete。
绝对。它是一个静态对象,将在程序结束时自动销毁。没有必要(也没办法)自己摧毁它。
(注意,作为静态,当Instance()
返回时它不会被摧毁。而是在程序结束时从main()
返回或调用{{1 }})。
答案 1 :(得分:1)
当静态对象超出范围时,它们将被自动删除,所以不要在静态对象上调用delete而你应该没问题
答案 2 :(得分:1)
您的错误是由于删除(如其他人所述)。
我需要一个单例类,因为我只需要初始化一些变量。
不,你真的(真的,真的)没有。单身人士解决了集中价值/设置的问题,同时引入隐藏状态,收紧模块耦合,隐藏模块依赖关系和渲染代码不可测试。
请考虑使用dependency injection。