【问题标题】:What happens to dynamically allocate objects inside of an object that is deleted?在被删除的对象内部动态分配对象会发生什么?
【发布时间】:2011-08-06 17:54:06
【问题描述】:

当我在对象上使用delete 关键字时,会执行对象析构函数吗?如果我删除的objected包含其他指针,我没有删除它们,那是内存泄漏吗?

我有时会对何时使用delete 感到困惑。当我传递东西时,问题对我来说是最糟糕的。我不知道什么时候可以安全使用delete,因为我害怕消除从其他地方指向的对象。

【问题讨论】:

  • 这不是delete 关键字的问题,而是每个对象销毁的问题。如果你离开你的对象在堆上分配的范围,析构函数将被调用并且你对指针的引用将丢失,同样的方式,如果你用new创建它并用delete销毁它。

标签: c++ pointers memory-management destructor


【解决方案1】:

当我在一个对象上使用 delete 关键字时,对象的析构函数会被执行吗?

是的。这就是析构函数的用途。

如果我删除的objected包含其他指针并且我没有删除它们,那是内存泄漏吗?

是的。这是最常见的内存泄漏来源之一。

我不知道什么时候使用 delete 是安全的,因为我害怕删除从其他地方指向的对象。

这是一个难题。没有系统可以完美地解决它,但是通过使用引用计数的智能指针和减少共享对象的数量,您可以做得很好。

【讨论】:

    【解决方案2】:

    当我在一个 object 是对象的析构函数 执行了吗?

    是的

    如果我删除了反对怎么办 包含其他指针,我不 删除它们,这是内存泄漏吗?

    是的,除非其他人也有指针并且其他人负责删除它们。您也可能因双重删除而遇到问题。如果你删除了一个给你的指针,但其他人有一个指向该内存的指针,那么他的指针现在什么都不指向。当他去使用那个指针时,他的程序可能会崩溃。

    我不知道什么时候可以安全使用 因为害怕删除一个 指向的对象 其他地方。

    你不是唯一一个。在代码的各个部分之间建立关于谁拥有什么的协议和约定很重要。什么是“生产”对象。什么在“消耗”它们。您可能还希望使用 boost::shared_ptr 和 boost::weak_ptr 等工具来允许引用计数。

    【讨论】:

      【解决方案3】:

      那是内存泄漏。这是一个非常普遍的问题。当您删除使用 new 为其分配内存的对象时,它将调用该对象的析构函数。析构函数是您应该提供实现以清理(删除)您在该对象的生命周期内可能已分配的所有内存的地方。

      【讨论】:

        【解决方案4】:

        如果你使用new,你必须使用delete。这将触发实例的析构函数被调用。如果该实例在其构造函数(或更高版本)中新建了任何对象,则应在其析构函数中删除它们。

        此外,如果您新建数组(new char[20] 等),则在删除时必须使用“delete []”,否则行为未定义。

        您可以通过使用 std::tr1::shared_ptr 或 boost::shared_ptr 来避免很多麻烦,它会为您进行引用计数和删除操作,而不是:

        Foo *pFoo = new Foo;
        

        std::tr1::shared_ptr<Foo> pFoo(new Foo);
        

        那么你不需要删除:当 shared_ptr 的公共引用计数变为零时,它会为你删除。

        【讨论】:

          【解决方案5】:

          是的,这是泄漏。看看Freestore management 常见问题解答是否可以为您的理解增加一些洞察力。

          【讨论】:

            【解决方案6】:

            当你调用 delete someObect; 会发生这样的事情:

            if(someObect != NULL)
            {
            someObect->~ClassName();// you did ClassName someObect = new ClassName(); 
            operator delete(someObect);
            }
            

            operator deletefree 一样,只是释放(释放)内存。但请记住,如果您使用 new,则不能使用 free,您必须使用 delete 并且只能使用它。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-06-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-11-06
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多