最好不要用 memset 来初始化一个类,而是用构造函数

如果我们用 C++ 类来编写程序且这个类中有虚函数,则他的初始化必须放在构造函数中,释放必须放在析构函数中,而不能试图用 memset 来初始化,为什么呢,因为 memset 把类内隐藏的虚函数指针也置为 0 了,看下面的例子代码
class Base
{
public:
    Base(void)
    {
    }
    virtual ~Base(void)
    {
    }
};
class Derive : public Base
{
public:
    Derive(void)
    {
    }
    virtual ~Derive(void)
    {
    }
};
void CDeletezsfededDlg::OnButton1()
{
    Derive *p = new Derive;
    memset(p, 0, sizeof(*p)); ///虚函数表也被置为 0
    delete p; ///试图调用基类 Base 和继承类 Derive 的虚析构函数,因为
              ///虚函数表被置为 0,所以内存访问错误
    p = NULL;
   
}

 

其它的虚函数,也存在这样的问题,所以一定要小心啊

memset进行指针变量的初始化

04-28

[code=perl]rnint _tmain(int argc, _TCHAR* argv[])rnrn //initiationrn _TCHAR* filename=_T("regenerate_original_picture.txt");rn unsigned char data[256];rn int packetlen=256;rn static unsigned short *ImageData[256][256][128];rn //What following below is define of the actual argument in the function of "Creat"rn HBITMAP hBitmap;rn BITMAPINFOHEADER *bmih=NULL ;rn unsigned short * pBits =(unsigned short*)memset( pBits, 0x24, 256*256*2 );//pBits是内容// 一旦create了,就可以直接操控PB IT s这个指针,rn //*( PB IT s + xxxx ) = 255; // 对某个像素赋值. rnrn rn //填装数据rn FILE *pfile=_tfopen(filename,_T("rb"));//rb要用_T转换一下rn for (int i = 0; i < 256; i++)rn for (int j = 0; j < 256; j++)rn rn fread(data, 1, packetlen, pfile);rn //dosomething //pBits,data,memcpy;rn memcpy(ImageData[i][j],data,256);rn rn int x=1;//x是标示波段的rn for (int v = 0; v < 256; v++)rn for (int c = 0; c < 256; c++)rn rn memcpy( pBits,ImageData[v][c][x],1);rn rnrn rn //CreateDIBitmap创建的是设备相关位图句柄 - HBITMAP. rn //CreateDIBSection创建的是设备无关位图句柄 - HBITMAP.rnrn rn rn rn //初始化BITMAPINFOHEADER结构的栏位rn bmih->biSize = sizeof (BITMAPINFOHEADER) ;rn bmih->biWidth = 256 ;rn bmih->biHeight = 256 ;rn bmih->biPlanes = 1 ;rn bmih->biBitCount = 16 ;rn bmih->biCompression = BI_RGB ;rn bmih->biSizeImage = 0 ;rn bmih->biXPelsPerMeter = 0 ;rn bmih->biYPelsPerMeter = 0 ;rn bmih->biClrUsed = 0 ;rn bmih->biClrImportant = 0 ;rn //在基本准备後,我们呼叫该函式:rn hBitmap = CreateDIBSection (NULL, (BITMAPINFO *) &bmih, 0, (void**)&pBits, NULL, 0) ;rn rn SaveBmp(hBitmap,"bitmap");rn return 0;rnrn[/code]rnrn--------------------------------rn报错 使用了未初始化pBits变量。。。。可是我初始化过了啊。。。rn楼主新手,欢迎指教。

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试