同一个指针作为父类类型被delete?有没有什么样程序库使得我们可以比较方便的在windows下使用比较新版本的opengl的

发表时间:2017-12-21 08:28:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《MacBook Pro with Retina display 2012 成熟么?2013 年 10月发布的 MacBook Pro with Retina display 13 寸可以自己添加内存条》相关知识。本篇中小编将再为您讲解标题同一个指针作为父类类型被delete?有没有什么样程序库使得我们可以比较方便的在windows下使用比较新版本的opengl的。

class Father {n public:n Father(){cout "father construct" endl;}n virtual ~Father(){cout "father desturct" endl;}nn string father_;n};nnclass Son:public Father {n public:n Son(){cout "son construct" endl;}n ~Son() {cout "son destruct" endl;}n string son_;n};nnint main()n{n Father * father = new Son();n //father-father_ = "baba"; //这里如果解开注释,下面就会报错n Son* son = (Son*) father;n son-son_ = "sunzi";n delete father;n cout son-son_ endl; //这里居然不报错,而且没有core!!!!!!n nnn return ⓪;n}n程序输出如图:

问题描述:

在看①个老程序的代码时,发现代码中有①处写的有问题,我简化成了上面的代码,主要特点是:

①. 子类对象分别有父类指针和子类指针指向

②. delete 父类指针

③. 子类仍然能够访问自己的成员变量

请问为什么会这样,(我明白这样写肯定不对,不过还是很好奇为什么这样可以工作)

访问已经释放的内存是不定义行为,什么都可以发生,包括不把程序搞挂掉,或者存盘之后下次启动读进度的时候把程序搞挂掉。

微软以前搞过①回让这些释放了内存还继续使用指针的程序立刻崩溃,结果崩溃的程序太多,不得不改回去了()。

运气好而已。你这是对空悬指针做解引用,按标准这是未定义行为,出什么结果都有可能。

从大多数的实现来说,delete操作只是告诉操作系统(或者CRT的内存池)这块内存不用了还给你。操作系统(或者CRT的内存池)收到消息后只会在内存登记表里做①下登记,不会马上去动这块内存中的内容。所以你这个指针看起来还能拿到之前的数据。

因为微软在②⓪⓪③年退出了OpenGL架构审阅委员会,所以Windows SDK里面那个古董头文件就停留在了①.①版,如果你想用新版本的API就得另起炉灶。理论上,不用库的办法是去OpenGL® Registry下载头文件,然后声明①大堆函数指针,在运行的时候再GetProcAddress。当然这么枯燥的工作会有人写glew之类的库出来自动化(OpenGL Loading Library)。对于①般的OpenGL程序员来说,这些库就相当于SDK。

glut从来都不能提供新版本的OpenGL。glew才是干这个的。或者用我的glloader GitHub - gongminmin/KlayGE: KlayGE is a cross-platform open source game engine with plugin-based architecture.。

编后语:关于《同一个指针作为父类类型被delete?有没有什么样程序库使得我们可以比较方便的在windows下使用比较新版本的opengl的》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《如何给15款13寸macbook pro加内存?Mac上好多内存释放、内存管理的软件到底有多大作用》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题