小(大)问题[1]-这种写法会内存泄漏?

今天突然想到一个问题,详情看代码吧。

奇怪的问题

#include <stdio.h>
#include <iostream>
class A
{
public:
    A() { std::cout << "i am A." << std::endl; }
    ~A() { std::cout << "release A." << std::endl; }
};

class B : public A
{
public:
    B() { std::cout << "i am B." << std::endl; }
    ~B() { std::cout << "release B." << std::endl; }
};

执行如下代码:

A *pA = new B();
delete pA;

此时看到的log如下:

i am A.
i am B.
release A.

那么,这个时候,class B的析构函数没有被调用到,(在class B的对象中包含其他对象,或者不包含其他对象的情况下)这样会导致内存泄漏吗?

避免上面的问题

对于上面问题,在不确定是否会导致内存泄漏前,写代码的时候可以注意将class的析构函数写为虚函数.示例如下:

#include <stdio.h>
#include <iostream>
class A
{
public:
    A() { std::cout << "i am A." << std::endl; }
    virtual ~A() { std::cout << "release A." << std::endl; }
};

class B : public A
{
public:
    B() { std::cout << "i am B." << std::endl; }
    ~B() { std::cout << "release B." << std::endl; }
};

再执行如下代码:

A *pA = new B();
delete pA;

看到的log就是这样了:

i am A.
i am B.
release B.
release A.

解答

还没有答案咯。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容