今天突然想到一个问题,详情看代码吧。
奇怪的问题
#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.
解答
还没有答案咯。
网友评论