請教一下new一個帶有virtual的基類之后,delete出現的非法訪問問題


下面的代碼,我需要一個class,但是為了省去了public,我全部弄成了struct。
現在有個問題,F5調試運行下,如果注釋了BaseA或者注釋了memset,則可以運行
否則,delete的時候就會報非法訪問。
我個人感覺這應該是設計到C++內部的一些問題。
如果不注釋BaseA的虛析構函數,把memset換成其他語句,比如,將pa強轉為子類型
然后給子類型的成員變量j賦值,這些都是可以的。唯獨用memset的時候,就有錯。
請問大伙兒,這是什么問題。

#include <iostream>

struct BaseA
{
virtual ~BaseA(){} // 注釋這里或這注釋掉memset,二選一
};

struct BaseB
{
virtual ~BaseB(){}
};

struct DeriB :public BaseB
{
int i;
};

struct FinalClz :public BaseA
{
DeriB b;
int j;
};

int main()
{
BaseA *pa = new FinalClz;
memset(pa, 0, sizeof(FinalClz));// 注釋這里或這注釋掉BaseA的虛析構函數,二選一
delete pa;
return 0;
}

3 个解决方案

#1


因為加了virtual ,就有了虛表,有了虛表后,你把對象全部置零(memset)破壞了虛表,所以delete出錯

#2


memset初始化???太神奇了,這是把C++當做純C來用嗎?

#3


應該添加構造函數, 而不是用memset

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com