我在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上运行时,有一种简单的方法可以看到我的内存是如何管理的?)
答案 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_powerDomain
,m_father
和m_modulType
是指针,除非您明确指出,否则不会删除它们指向的对象。所以,如果你想要删除它们,你应该编写一个析构函数,否则它们不需要。
我知道字符串是一个标准对象,它将被自己的析构函数破坏,但是ConnexionHashMap会被标准的hashmap模板析构函数破坏,还是应该以某种方式手动删除它?
std::string
不是标准对象会自动删除它们,而是你在类中包含std::string
作为成员的事实,所以字符串是在物理上分配的您的对象内存,当删除此对象时,前者也是(不需要在析构函数中指定任何内容)。
所有相同的,m_connexions
,作为对象成员而不是指针,将被析构函数自动删除,无需执行任何操作。
(另请注意,在我的程序在Eclipse cdt上运行时,有一种简单的方法可以看到我的内存是如何管理的?)
你可以使用像valgrind这样的探查器或你找到的任何其他探测器......
答案 4 :(得分:1)
一些基本原则:
hash_map
)包含
值;你的内容
ConnectionHashMap
是。的副本
无论你插入什么,都会
被破坏者破坏了
哈希映射。 (我不确定是否或
这与你的代码有什么关系。一个
很多取决于什么的寿命
net
指向,以及如何指出
管理。取决于
应用和设计,它
可能有意义使Connection::net
成为一个
boost::shared_ptr
。 可能:它是
这不是定局
是一个好主意。)