eclipse cdt-类析构函数c++

eclipse cdt - Class destructor c++

本文关键字:c++ 析构函数 cdt- eclipse      更新时间:2023-10-16

我有一个关于c++中析构函数的问题。

我有这样一门课:

class X {  
private:
    string m_instanceName
    string m_path;
    ConnexionHashMap m_connexions;
    Module** m_moduleType;
    Powerdomain* m_powerDomain;
    Module ** m_father;
};  

以下是有关ConnexionHashMap的一些信息:

typedef hash_map<const string, Connexion, strptrhash, strptrequal> ConnexionHashMap;
struct Net{
     string name;
     vector<string> connectedPins;
     bool isPin;
};
typedef struct Net Net;
struct Connexion{
    string pin;
    Net* net;
};
typedef struct Connexion Connexion;

如果我不想删除m_moduleType、m_powerDomain和m_father(因为它们可能被另一个对象引用),我是否必须明确地编写一个析构函数方法?

我知道字符串是一个标准对象,会被它自己的析构函数破坏,但ConnexionHashMap会被标准哈希映射模板析构函数摧毁吗?或者我应该手动删除它吗?

(顺便说一句,当我的程序在Eclipse cdt上运行时,有没有一种简单的方法可以查看我的内存是如何管理的?)

如果我不想删除m_moduleType m_powerDomain和m_father(因为它们可能被另一个对象引用,我必须明确地写一个析构函数方法吗?

m_powerDomainm_fatherm_modulType是指针,除非明确删除,否则不会删除它们所指向的对象。所以,如果你想删除它们,你应该写一个析构函数,否则就不需要了。

我知道字符串是一个标准对象,会被它自己的析构函数破坏,但ConnexionHashMap会被标准哈希映射模板析构函数摧毁吗?或者我应该手动删除它吗?

这并不是说std::string是标准对象,会自动删除它们,而是因为你在类中包含了一个std::string作为成员,所以字符串在对象内存中物理分配,当这个对象被删除时,前者也是(无需在析构函数中指定任何内容)。

尽管如此,作为对象成员而非指针包含的m_connexions将被析构函数自动删除,无需执行任何操作。

(顺便说一句,当我的程序在Eclipse cdt上运行时,有没有一种简单的方法可以查看我的内存是如何管理的?)

你可以使用像valgrind这样的探查器或任何其他可用的探查器。。。

hash_map被删除,因为它是类X的成员。用指针寻址的对象不会被删除,如果需要删除这些对象,则必须编写析构函数。

类中的局部变量将在删除该类时自动删除(即使没有显式析构函数)。

用户定义的析构函数用于删除指针持有的变量,并释放类持有的资源。

只需对共享对象使用boost::shared_ptr(C++0x中的std::shared_ptr),就可以避免任何问题。它使用引用计数来跟踪对对象的引用,并在最后一个引用消失后删除对象。

至于您的问题,当包含对象被销毁时,所有不是指针或引用的成员对象都将被销毁。这包括您的哈希图

一些基本原则:

  • 的析构函数都是非静态的成员对象将在对象的析构函数。无论您是否定义是否为析构函数;有没有的方式改变这一点
  • 基本类型的析构函数,指针类型和引用类型是没有操作。总是如果你愿意他们身上发生了什么事,你必须提供用户定义的析构函数,并在那里实现它
  • 标准容器(以及所有预标准hash_map)包含价值您的ConnectionHashMap是无论你插入了什么被的析构函数破坏散列映射。(我不确定这与您的代码有何关联。A.很大程度上取决于什么net指向,以及如何指向管理。取决于应用程序和设计使Connection::net成为boost::shared_ptr可能:这不是必然的结论是个好主意。)