eclipse cdt-类析构函数c++
eclipse cdt - Class destructor 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_moduleType、m_powerDomain和m_father(因为它们可能被另一个对象引用),我是否必须明确地编写一个析构函数方法?
我知道字符串是一个标准对象,会被它自己的析构函数破坏,但ConnexionHashMap会被标准哈希映射模板析构函数摧毁吗?或者我应该手动删除它吗?
(顺便说一句,当我的程序在Eclipse cdt上运行时,有没有一种简单的方法可以查看我的内存是如何管理的?)
如果我不想删除m_moduleType m_powerDomain和m_father(因为它们可能被另一个对象引用,我必须明确地写一个析构函数方法吗?
m_powerDomain
、m_father
和m_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
可能:这不是必然的结论是个好主意。)
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- 不命名构造函数和析构函数上的类型错误