首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保调用Derived2析构函数?

如何确保调用Derived2析构函数?
EN

Stack Overflow用户
提问于 2014-03-21 18:15:36
回答 2查看 61关注 0票数 0
代码语言:javascript
复制
#include <iostream>

using namespace std;

class Base
{
    public:
        Base ( )
        {
            cout << "Inside Base constructor" << endl;
        }

        ~Base ( )
        {
            cout << "Inside Base destructor" << endl;
        }

};

class Derived : public Base
{
    public:    
        Derived  ( )
        {
        cout << "Inside Derived constructor" << endl;
        }

        ~Derived ( )
        {
            cout << "Inside Derived destructor" << endl;
        }
};

class Derived2 : public Base
{
    public:
        static void bogus(Derived2* d)
        {
            cout << "bogus" << endl;
        }

        Derived2  ( )
        {
            cout << "Inside Derived2 constructor" << endl;
        }

        ~Derived2 ( )
        {
            cout << "Inside Derived2 destructor" << endl;
        }
};

int main( )
{
    Derived y;
    Derived2::bogus( new Derived2 ());

    return 0;
}

-

代码语言:javascript
复制
>Inside Base constructor
>Inside Derived constructor
>Inside Base constructor
>Inside Derived2 constructor
>bogus
>Inside Derived destructor
>Inside Base destructor
>Press <RETURN> to close this window...

我在测试一些东西发现了这种奇怪的行为。在参数字段中创建对象时,为什么不调用析构函数?是否有任何解决方案,它是否需要,是否存在内存泄漏?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-21 18:23:23

首先,当您要使类彼此派生时,应该确保析构函数是virtual。如果没有,则当派生类有其他成员时,可能会出现内存泄漏:

代码语言:javascript
复制
virtual ~Base ( )
{
  cout << "Inside Base destructor" << endl;
}

第二,当您使用new分配内存时,将不会在创建的对象上调用析构函数,直到使用delete手动删除它为止。

代码语言:javascript
复制
int main( )
{
  Derived y;
  Derived2 *ptr = new Derived2();
  Derived2::bogus(ptr);
  delete ptr;
  return 0;
}

如果您不确定何时删除对象,请在类的析构函数中使用std::shared_ptr或删除它,并将其作为参数。请注意,shared_ptr只适用于C++11,如果您使用的是旧版本(像许多人一样),请尝试使用boost库。

票数 4
EN

Stack Overflow用户

发布于 2014-03-21 18:24:51

new创建的任何东西都需要delete。这里您正在创建temp对象。在传递到函数之前尝试创建。同时制作base destructor virtual

代码语言:javascript
复制
int main( )
{

  Derived y;
  Derived2 *d2 = new Derived2();
  Derived2::bogus( d2);

  delete d2;

  return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22566512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档