堆栈对象的问题

堆栈对象的问题

#include <iostream>

using namespace std;

class A {

  public:
    A() {

        cout << "A()" << endl;

        aptr = new char[100];
    }

    ~A() {

        cout << "~A()" << endl;

        delete[] aptr;
    }

  private:
    char* aptr;
};

class B : public A {

  public:
    B() {

        cout << "B()" << endl;

        bptr = new char[100];
    }

    ~B() {

        cout << "~B()" << endl;

        delete[] bptr;
    }

  private:
    char* bptr;
};

void free_function(A* p)

{

    delete p;
}

int main(void)

{
    cout << "--------------------------" << endl;

    B b;
    B* bobject_s = &b;

    B* bobject = new B;

    free_function(bobject);

    return 0;
}

课上代码中基类A,派生类B,的构造函数都在堆区分配了char[100]大小的内存,

  1. B* bobject = new B;这段代码栈区指针bobject指向堆区内存一块B类对象的内存,内存中包含bptr这个堆区内存。 这样理解对吗?

  2. B b;
    B* bobject_s = &b;
    这段代码栈区指针bobject_s指向栈区对象b的地址,那么b这个栈区对象,内部怎么储存char[100]这样堆区内存呢?

基类的指针或引用指向派生类对象的时候,可以通过删除基类指针调用派生类析构函数和基类析构函数,防止资源的未释放

课件上面这句话不太理解

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
山行老师 2022-11-27 19:10:45
问题1 对的;
问题2 对象实例的内存是指其成员占用的内存,
如果成员是指针,那么指针指向位置X可以是堆也可以是栈,只是对象实例拥有对X的访问能力而已;
实例的内存空间并不包含new char[100]这个堆空间,只是实例有个成员指向了char[100]这个空间而已;
问题3 析构基类实例时,根据基类的虚析构函数特性,会连带执行派生类的析构,这个逻辑就是虚函数的逻辑,不这样做的话派生类相较于基类增加的内存部分得不到释放,会造成严重的内存泄露。
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师