源代码
// A block
struct TransferLinkInfo
{
public:
TransferLinkInfo()
:ulStockCode(0)
,ulMarketCode(0)
,ucLinkId(0)
,cMarket(0)
{
memset(this, 0, sizeof(TransferLinkInfo));
}
TransferLinkInfo(const TransferLinkInfo& t)
{
ulStockCode = t.ulStockCode;
ulMarketCode = t.ulMarketCode;
ucLinkId = t.ucLinkId;
cMarket = t.cMarket;
}
virtual ~TransferLinkInfo(){}
public:
UINT32 ulStockCode;
UINT32 ulMarketCode;
unsigned char ucLinkId;
char cMarket; //为兼容apperserver的marketcode而增加的定义
};
问题分析
原因
这本是一个结构体,但因为继承原因,它实际上是一个class, 所以我自然而然地为析构函数加上了virtual描述符, 所以this指针的位置第一个变量实际上是虚函数表的地址,而memset的使用会导致该变量变为0,也即是内核区域的地址,导致delete的时候访问了不该访问的区域,最终程序崩溃。
结论
如果只是结构体的话,memset可以用来初始化。
如果是父类的话,memset不能使用,因为会覆盖虚函数表的地址。