我已经创建了一个实例化类的函数,并进行了一些操作。之后返回该函数,这意味着范围结束。一旦范围结束,它应该调用类的析构函数。但是,我没有看到析构函数被调用。它背后的原因是什么?我在这里错过了什么吗?
/***
The static member in the class is just a declaration, whose namespace scope is limited to the class.
One need to define it in the corresponding source of the class header. This way, the static member is
allocated a space on the Data segment. In case the static member is not defined, then the linker will
throw an error.
**/
class category_to_subcategory
{
/** static members have just declaration not definition **/
static QMultiMap<QString,QString>m_cat_to_subcat;
public:
/** The const can give a definition to it within the class, thus no need to define it **/
/** C++ allows only "integer const static" types to be defined within a class */
/** both are same const static or static const **/
const static int categ_const = 10;
static void insert_subcat();
/** template **/
QList<QString> get_subcat(QString &cat);
QList<QString> get_subcat(const QString &cat);
~category_to_subcategory();
};
/** When you want to map a string to string, you can use QMultimap **/
/** It is quite easy to get the values using QMultimap **/
/** definition of m_cat_to_subcat, the namescope is bind to the class name - category_to_subcategory **/
QMultiMap<QString,QString> category_to_subcategory::m_cat_to_subcat;
void category_to_subcategory::insert_subcat()
{
qDebug()<<__PRETTY_FUNCTION__;
m_cat_to_subcat.clear();
m_cat_to_subcat.insert("OS", "Linux");
m_cat_to_subcat.insert("OS", "Windows");
m_cat_to_subcat.insert("OS", "MAC");
m_cat_to_subcat.insert("SHELL", "BASH");
m_cat_to_subcat.insert("SHELL", "KSH");
m_cat_to_subcat.insert("SHELL", "CSH");
m_cat_to_subcat.insert("MOUSE", "WIRED");
m_cat_to_subcat.insert("MOUSE", "WIRELESS");
}
QList<QString> category_to_subcategory::get_subcat(QString &cat)
{
qDebug()<<__PRETTY_FUNCTION__;
if(category_to_subcategory::m_cat_to_subcat.empty()) {
category_to_subcategory::insert_subcat();
}
QList<QString> subcat_list = m_cat_to_subcat.values(cat);
return subcat_list;
}
QList<QString> category_to_subcategory::get_subcat(const QString &cat)
{
qDebug()<<__PRETTY_FUNCTION__;
if(category_to_subcategory::m_cat_to_subcat.empty()) {
category_to_subcategory::insert_subcat();
}
QList<QString> subcat_list = m_cat_to_subcat.values(cat);
return subcat_list;
}
category_to_subcategory::~category_to_subcategory()
{
qDebug()<<__PRETTY_FUNCTION__;
delete this;
}
void function_to_QMAP()
{
qDebug()<<__PRETTY_FUNCTION__;
category_to_subcategory *cat_to_subcat_Instance = new category_to_subcategory;
QString cat = "OS";
qDebug()<<cat_to_subcat_Instance->get_subcat(cat);
cat = "SHELL";
qDebug()<<cat_to_subcat_Instance->get_subcat(cat);
cat = "MOUSE";
qDebug()<<cat_to_subcat_Instance->get_subcat(cat);
/** Passing just the string will throw an error **/
//qDebug()<<cat_to_subcat_Instance->get_subcat("MOUSE");
/** no matching function for call to 'category_to_subcategory::get_subcat(const char[6]); */
qDebug()<<"The const category is"<<cat_to_subcat_Instance->get_subcat("OS");
qDebug()<<"The static const integer defined in class value is "<<category_to_subcategory::categ_const;
}
void function_op_finish()
{
qDebug()<<__PRETTY_FUNCTION__;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
function_to_QMAP();
function_op_finish();
return a.exec();
}
答案 0 :(得分:2)
似乎你在C ++中混淆了两种类型的内存分配 - 基于堆栈(局部变量在堆栈上分配并在函数退出时自动销毁)和基于堆(使用'new'分配,程序员负责确保在某些时候调用'删除')
这是关于差异的friendly tutorial,欢迎使用C ++手动管理内存的悲欢离合(它可能是语言中错误和问题的最大来源)。请注意,链接特指C而不是C ++,但两者的概念相同。
答案 1 :(得分:1)
因为您没有delete
cat_to_subcat_Instance
。这是一个内存泄漏:对象被创建,但从未被破坏。
在您的特定代码片段中,我认为无需动态分配cat_to_subcat_Instance
。为什么不这么简单呢?
void function_to_QMAP()
{
qDebug()<<__PRETTY_FUNCTION__;
category_to_subcategory cat_to_subcat_Instance;
QString cat = "OS";
qDebug()<<cat_to_subcat_Instance.get_subcat(cat);
cat = "SHELL";
qDebug()<<cat_to_subcat_Instance.get_subcat(cat);
cat = "MOUSE";
qDebug()<<cat_to_subcat_Instance.get_subcat(cat);
/** Passing just the string will throw an error **/
//qDebug()<<cat_to_subcat_Instance.get_subcat("MOUSE");
/** no matching function for call to 'category_to_subcategory::get_subcat(const char[6]); */
qDebug()<<"The const category is"<<cat_to_subcat_Instance.get_subcat("OS");
qDebug()<<"The static const integer defined in class value is "<<category_to_subcategory::categ_const;
}
答案 2 :(得分:0)
您使用运算符new
在堆中分配了category_to_subcategory类型的对象。
category_to_subcategory *cat_to_subcat_Instance = new category_to_subcategory;
要删除此对象,您需要显式调用operator delete
。
还要考虑class_to_subcategory类的析构函数是无效的。
category_to_subcategory::~category_to_subcategory()
{
qDebug()<<__PRETTY_FUNCTION__;
delete this;
}
它的调用将导致析构函数的递归调用,直到堆栈内存耗尽为止。 删除带有删除的语句。
category_to_subcategory::~category_to_subcategory()
{
qDebug()<<__PRETTY_FUNCTION__;
}