同一个指针作为父类类型被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.。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
