【问题标题】:Class destructor c++类析构函数 C++
【发布时间】:2011-09-01 19:50:25
【问题描述】:

我有一个关于 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(因为它们很可能被另一个对象引用),我是否必须显式编写析构函数?

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

(在旁注中还有一种简单的方法可以查看我的程序在 Eclipse cdt 上运行时如何管理我的内存?)

【问题讨论】:

  • 完全不相关的评论:在 C++ 中,您无需显式地 typedef 结构即可在没有 struct 关键字的情况下使用它。结构就像一个类(但其成员默认声明为公共)。
  • 它不相关但仍然有用,感谢您的提示;)
  • CDT 有到 GDB 的控制台界面吗?如果是这样,您可以随时发出命令x,例如x myptrx/64xb(将64 字节显示为十六进制。)供参考sourceware.org/gdb/current/onlinedocs/gdb/…

标签: c++ eclipse-cdt


【解决方案1】:

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

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

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

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

同样,m_connexions,作为对象成员,而不是指针,会被析构函数自动删除,不需要做任何事情。

(在旁注中还有一种简单的方法可以查看我的程序在 Eclipse cdt 上运行时如何管理我的内存?)

您可以使用 valgrind 之类的分析器或您发现可用的任何其他工具...

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那将是递归销毁?即它会自动删除地图中的Connexion 对吗? (只是为了澄清事情)
    • hash_map 析构函数将删除它拥有的 Connexion 对象。 Connexion 析构函数将删除包含的字符串成员。指针没有析构函数。如果 Net 对象归 Connexion 对象所有,则需要一个析构函数,否则(Connexion 只有一个弱指针)依赖 hash_map 析构函数就足够了。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • @Christian:我已经添加了一个答案。此外,如果您认为某事应该是评论而不是答案,请将其标记为不是答案
      • 这可能会很有趣并且有助于进一步的发展。你有一个如何使用该凸轮的详细示例的链接吗?
      • @djfox:我添加了指向boost::shared_ptr 文档的链接。这应该给你一个起点。
      【解决方案5】:

      一些基本原则:

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

      【讨论】:

        猜你喜欢
        • 2014-05-27
        • 2013-07-28
        • 1970-01-01
        • 2019-08-08
        • 2015-04-30
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 1970-01-01
        相关资源
        最近更新 更多