有如下程序段: #include using namespace std; class base { public: base(int cnt) { resource=new int[cnt]

admin2021-07-02  17

问题 有如下程序段:
    #include
    using namespace std;
    class base
    {
    public:
    base(int cnt)
    {
    resource=new int[cnt];
    }
    ~base()
    {
    delete[]resource;
    }
    virtual void show()
    {
    cout<<"base"<    }
    int*resource:
    };
    class derived:public base
    {
    public:
    derived(int cnt):base(cnt)
    {
    resource=new float[cnt];
    }
    ~derived()
    {
    delete[]resource;
    }
    void show()
    {
    COUt<<"derived"<    }
    float*resource;
    };
    上述程序使得derived对象中的动态内存空间有可能不被释放,有内存泄漏风险,原因是(    )。

选项 A、base类是抽象类
B、derived类的析构函数没有释放基类的动态内存
C、base类的析构函数不是虚函数
D、derived类的resource与公有继承得到的resource同名

答案C

解析 基类base中的数据成员resouree为整型指针变量,派生类derived中的数据成员resource与基类base中的同名,但类型为浮点型指针变量,基类base中构造函数使用new为resource(整型指针)分配了内存空间,在析构函数中释放;派生类derived的构造函数在成员初始化类表中调用base的构造函数构造对象的基类部分,然后在构造函数体内使用new为resource(浮点型指针)分配了内存空间,在析构函数中释放浮点型resource指针;由于基类base中的析构函数未定义为虚函数,所以派生类derived中的析构函数在被调用时,不会再调用基类base中的析构函数,导致基类base中的整型指针变量resource无法释放,造成内存泄漏。故本题答案为C选项。
转载请注明原文地址:https://jikaoti.com/ti/Ujh0FFFM
0

最新回复(0)