类析构函数c ++

时间:2011-05-25 14:20:36

标签: c++ eclipse-cdt

我在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_powerulmain m_powerDomain和m_father(因为它们很可能被另一个对象引用),我是否必须明确地编写析构函数方法?

我知道字符串是一个标准对象,它将被自己的析构函数破坏,但是ConnexionHashMap会被标准的hashmap模板析构函数破坏,还是应该以某种方式手动删除它?

(另请注意,在我的程序在Eclipse cdt上运行时,有一种简单的方法可以看到我的内存是如何管理的?)

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

用户定义的析构函数用于删除指针持有的变量,以及该类持有的空闲资源。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

  

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

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

  

我知道字符串是一个标准对象,它将被自己的析构函数破坏,但是ConnexionHashMap会被标准的hashmap模板析构函数破坏,还是应该以某种方式手动删除它?

std::string不是标准对象会自动删除它们,而是你在类中包含std::string作为成员的事实,所以字符串是在物理上分配的您的对象内存,当删除此对象时,前者也是(不需要在析构函数中指定任何内容)。

所有相同的,m_connexions,作为对象成员而不是指针,将被析构函数自动删除,无需执行任何操作。

(另请注意,在我的程序在Eclipse cdt上运行时,有一种简单的方法可以看到我的内存是如何管理的?)

你可以使用像valgrind这样的探查器或你找到的任何其他探测器......

答案 4 :(得分:1)

一些基本原则:

  • 所有的析构函数是非静态的 将在中调用成员对象 你的对象的析构函数。 无论你是否定义了 析构函数与否;有没有的方式 改变这一点。
  • 基本类型的析构函数, 指针类型和引用类型 空操作。总是。如果你想 你必须要发生在他们身上的事情 提供用户定义的析构函数, 并在那里实现。
  • 标准容器(和所有的 预标准hash_map)包含 值;你的内容 ConnectionHashMap是。的副本 无论你插入什么,都会 被破坏者破坏了 哈希映射。 (我不确定是否或 这与你的代码有什么关系。一个 很多取决于什么的寿命 net指向,以及如何指出 管理。取决于 应用和设计,它 可能有意义使Connection::net成为一个 boost::shared_ptr可能:它是 这不是定局 是一个好主意。)