2014-03-03 72 views
0

我做了一个实例化类的函数,并做了一些操作。之后,函数返回,这意味着范围结束。一旦范围结束后,它应该调用该类的析构函数。但是,我没有看到析构函数被调用。它背后的原因是什么?我在这里错过了什么吗?为什么在这个程序中不调用析构函数?

/*** 

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

你为什么要粘贴X页的代码,而不是告诉我们你正在谈论的是什么功能? – quetzalcoatl

+3

把'delete this'放在析构函数中永远都不是正确的事情。 'delete'调用析构函数,而不是相反。 – Sneftel

回答

1

因为你没有deletecat_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; 


} 
+0

@SHREYASJOSHI:因为这不是_dynamic_ allocation的工作方式。但这就是堆栈分配的工作原理。查看我的编辑答案,了解如何在堆栈上分配的示例。 –

+0

@SHREYASJOSHI:变量是一个指向对象的指针。变量在超出范围时被销毁。所以,**指针**在超出范围时被销毁。它指向的对象不会被销毁。如果你想使用一个'指针式的东西',也会自动销毁对象 - 使用智能指针。 – quetzalcoatl

2

似乎你混淆了两种类型的C++内存分配 - 基于堆栈(局部变量分配在堆栈上,并自动退出函数时破坏)使用“新”和分配和基于堆的(程序员负责确保'删除'在某些时候被调用)

这里是一个关于friendly tutorial的区别,并且欢迎使用C++手动管理内存的悲欢离合(这可能是错误和问题的最大来源在语言中)。请注意,链接特指C而不是C++,但概念在两者中都是相同的。

0

您使用运算符new在堆中分配了category_to_subcategory类型的对象。

category_to_subcategory *cat_to_subcat_Instance = new category_to_subcategory; 

要删除此对象,您需要明确地调用运算符delete

还要考虑到类category_to_subcategory的析构函数无效。

category_to_subcategory::~category_to_subcategory() 
{ 
    qDebug()<<__PRETTY_FUNCTION__; 
    delete this; 
} 

它调用将导致析构函数的递归调用,直到堆栈内存将被耗尽。 删除语句。

category_to_subcategory::~category_to_subcategory() 
{ 
    qDebug()<<__PRETTY_FUNCTION__; 
} 
相关问题