256色位图的BITMAPINFO结构内存分配,我是这样做的:
char *pBmpInfo = new char[sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD) + 1];
pBmpInfo[sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD)] = '\0';
LPBITMAPINFO pBitmapInfo = (LPBITMAPINFO) pBmpInfo;而在很多地方,我发现大家是这样做的:
LPBITMAPINFO pBitmapInfo = (LPBITMAPINFO) new char[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];对于后一种方法,我想问:
1. BITMAPINFO结构中已经有了一个RGBQUAD结构变量,那么我们在添加内存申请时,只需要再多添加255 * sizeof(RGBQUAD)的内存就够了,为什么还要256呢?2. 它是如何释放申请的内存的? delete pBitmapInfo; 可以完全释放掉pBitmapInfo指向的内存空间吗?我使用方法一申请内存后,内存释放是这样的 delete []pBmpInfo; pBmpInfo = NULL; pBitmapInfo = NULL; 这样做是不是显得多余累赘了?
谢谢大家的帮忙!

解决方案 »

  1.   

    1 你说的没错,后一种方法浪费一个RGBQUAD而已。你也浪费一个字节,因为位图数据是二进制数据,无法作为字符串处理,完全不用结尾'\0'。2 多余累赘也没错,也可以说是画蛇添足。
      

  2.   

    1. char *pBmpInfo = new char[sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD) + 1];
     不明白为什么要加1,而且
    “ BITMAPINFO结构中已经有了一个RGBQUAD结构变量,那么我们在添加内存申请时,只需要再多添加255 * sizeof(RGBQUAD)的内存就够了”
    不明白你什么意思啊。
    BITMAPINFO结构中是含有RGBQUAD结构,但不是一个啊,应该是图像中完整的RGBQUAD。对一个256色图像来说,就应该有256个RGBQUAD吧?!2.使用delete的时候得先看当初分配是用new还是malloc分配的,如果是new的话,用delete,否则用free,不然会出现不可预见的错误。
    用delete时,如果是在对象的外部,是不需要在delete后将指针置NULL的,但如果是在对象内部分配的内存,delete后就要将相应指针置NULL。不过这也要看你的析构函数具体怎么写的。
    呵呵