2011-05-25 87 views
0

我有一个关于C++析构函数的问题。类析构函数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_modulType的m_powerDomain和m_father(因为它们很可能会被另一个对象引用),我是否必须明确地编写一个析构函数方法?

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

(也对阿里纳斯有一个简单的方法,看看我的程序是在Eclipse CDT的运行,而我的内存是如何管理的?)

+1

相当无关点评:在C++中,你不需要明确的typedef一个结构使用它无线没有结构关键字。结构就像一个类(但默认情况下声明为公共成员)。 – 2011-05-25 14:29:54

+0

这是不相关的,但仍然有用,谢谢你的提示;) – djfoxmccloud 2011-05-25 14:33:13

+0

CDT有一个控制台界面GDB?如果是这样,你总是可以发出命令'x',例如'x myptr'或'x/64xb'(显示64字节为十六进制)。参考http://sourceware.org/gdb/current/onlinedocs/gdb/ Memory.html#Memorygdb_56.html – Skurmedel 2011-05-25 14:37:42

回答

2

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

m_powerDomainm_fatherm_modulType是指针。他们还指出,除非你明确地这样做,以不会被删除的对象。所以,你应该写一个析构函数,如果你希望他们被删除,否则他们不需要。

我KN ow这个字符串是一个标准对象,并且会被它自己的析构函数销毁,但是ConnexionHashMap会被标准的hashmap模板析构函数销毁还是应该以某种方式手动删除它?

这并不是说std::string是标准的对象,这将使他们自动删除,但事实上,你包括你的类作为成员的std::string,使该字符串的对象的内存,当内部物理分配这一个被删除前者也是(不需要在析构函数中指定任何东西)。

全部相同,m_connexions作为对象成员包含,不是指针,将被析构函数自动删除,不需要做任何事情。

(也旁注有一个简单的方法,看看我的程序是在Eclipse CDT的运行时,我的记忆中是如何管理的?)

,你可以使用一个分析器的valgrind一样或其他任何你找到可利用的。 。

2

可避免出现任何问题这里由刚刚在C +使用boost::shared_ptrstd::shared_ptr + 0x)共享对象。它使用引用计数来跟踪对象的引用,并在最后一个引用消失后删除对象。

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

+0

@Christian:我已经添加了一个答案。此外,如果您认为某些内容应该是评论而不是答案,请将其标记为*而不是答案*。 – 2011-05-25 14:28:12

+0

这可能是有趣的,有助于进一步发展。您是否有链接了解如何使用该凸轮的详细示例? – djfoxmccloud 2011-05-25 14:39:36

+0

@djfox:我添加了一个链接到'boost :: shared_ptr'的文档。这应该给你一个起点。 – 2011-05-25 14:41:58

2

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

用户定义的析构函数用于删除指针保存的变量以及类所拥有的空闲资源。

+1

这应该是“一个*用户定义的*析构函数”...... – 2011-05-25 14:31:33

2

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

+0

那会是一个递归破坏?即它会自动删除地图上的Connexion? (只是为了清除事情) – djfoxmccloud 2011-05-25 14:38:32

+0

hash_map析构函数将删除它拥有的Connexion对象。 Connexion析构函数将删除包含的字符串成员。指针没有析构函数。如果Net对象由Connexion对象拥有,那么你需要一个析构函数(Connexion只有一个漏洞指针),这足以依赖hash_map分解器。 – harper 2011-05-26 09:30:22

1

一些基本原则:

  • 的析构函数都非静态成员 对象将在析构函数 你的对象的调用。不管你是否定义了一个 析构函数,有改变这个的没有方式 。
  • 基本类型的析构函数, 指针类型和引用类型是 no-ops。总是。如果你想 发生在他们身上,你必须 提供一个用户定义的析构函数, ,并在那里发生。
  • 标准容器(和所有的 预标准hash_map)包含 值; ConnectionHashMap的内容是 的副本,无论您插入什么内容,并且将由 哈希映射的析构函数破坏 。 (我不知道是否 如何,这是有关你的代码。 很大程度上取决于什么 net点的寿命,以及如何为 管理。根据 应用而设计,它 。可能,应使Connection::net一个 boost::shared_ptr强权:这是 不是已成定局,这 是一个好主意)