ahapeach 2021-02-03 16:27 采纳率: 50%
浏览 839
已采纳

vs2019中程序运行出错:未加载wntdll.pdb

一个简单小程序运行出错,好像是delete d处发生了问题,不明白为什么,麻烦大佬们瞅一瞅

#include<iostream>
using namespace std;
#include<string>
//抽象类
class CPU
{
public:
	virtual void calculate() = 0;
};
class Display
{
public:
	virtual void disp() = 0;
};

//子类继承并重写抽象方法
class Inter :public CPU, public Display
{
public:
	void calculate()
	{
		cout << "Inter牌CPU正在计算" << endl;
	}
	void disp()
	{
		cout << "Inter牌显卡正在工作" << endl;
	}
};

class Lenovo :public CPU, public Display
{
public:
	void calculate()
	{
		cout << "Lenovo牌CPU正在计算" << endl;
	}
	void disp()
	{
		cout << "Lenovo牌显卡正在工作" << endl;
	}
};

class computer
{
public:
	void show(CPU* c, Display* d)
	{
		c->calculate();
		d->disp();
		
		if (c != NULL)//这里都可以释放内存
		{
			delete c;
			c = NULL;
		}
		if (d != NULL)//这里判断了d不为空指针
		{
			delete d;//好像是这里程序崩了,为啥不能释放啊????
			d = NULL;
		}
	}
};
int main()
{
	computer c;
	c.show(new Lenovo, new Inter);
}

谢谢大家!!!

  • 写回答

2条回答 默认 最新

  • wlj1234 2021-02-08 10:08
    关注

    这是因为你的函数void show(CPU* c, Display* d);而不是void show(Lenovo* c, Inter* d);

    无虚析构函数的时候系统会认为你释放的是CPU对象内存而不是Lenovo对象,无法正确释放内存

    有虚析构函数的存在,在释放内存时虚表中的信息找到实际对象(Lenovo)所在的内存块进行释放

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分