关于new定义数组的问题?

gioc 2006-09-04 09:41:00
程序段如下:
unsigned long pTmpBm[hi*wid];
//unsigned long *pTmpBm=new unsigned long[hi*wid];

........
.......

::StretchDIBits(HTargetDC,
0, 0,
dst_width, dst_height,
0, 0,
src_width, src_height,
pTmpBm,
pbmi.get(),
DIB_RGB_COLORS,
SRCCOPY);

// delete[] pTmpBm;
数组这样unsigned long pTmpBm[hi*wid]就正常,
若改为unsigned long *pTmpBm=new unsigned long[hi*wid]就不行?

为什么,能解决吗?我还是想用动态分配的!!
...全文
641 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangshx 2006-09-14
  • 打赏
  • 举报
回复
楼主只是在调试的过程中看不到new的pTmpBm数组值,bcb是这样的,结果对就行了.
一个不是很好的办法.
调试时有些情况下必须看中间值,可以定义临时的unsigned long pTmpBm0000[hi*wid];
然后把pTmpBm赋值给pTmpBm0000,就看到了中间值,发布程序的时候再把有关pTmpBm0000语句都去了
liu_jun_ivan 2006-09-14
  • 打赏
  • 举报
回复
从搂主的情况看:
1、不大可能是动态存储区内存不足,否则new时会有exception;
2、new得到的内存与数组的内存位于不同的存储区,有些API对此可能有要求(典型的比如Window COM接口API中的String),好好看一下API的参考手册;
3、用变量指定数组大小的语法是比较新的,在当前gcc版本之外的其他编译器上极有可能编译通不过;
4、把new操作放在try... catch中是个好习惯,因为这个操作失败会抛出异常,而不是返回NULL;
5、可能这只是个表面现象,是你程序代码的其他地方执行了不当操作,导致内存已经混乱,在此发生奇怪现象。所以其他人都无法重现你的问题。
acbbli 2006-09-14
  • 打赏
  • 举报
回复
new 应该是连续的
你可以试试这样定义
unsigned long *pTmpBm=new BYTE[sizeof(unsigned long)*hi*wid];
gioc 2006-09-05
  • 打赏
  • 举报
回复
不是不能定义数组,而是动态定义了数组在
StretchDIBits(HTargetDC,
0, 0,
dst_width, dst_height,
0, 0,
src_width, src_height,
pTmpBm,
pbmi.get(),
DIB_RGB_COLORS,
SRCCOPY)里不能正常的显示,我把代码详细的贴出来:

template <int hi, int wid>
void Cimage<hi,wid>::DrawBmp(HDC HTargetDC,int dst_width, int dst_height,
int src_width, int src_height) const
{
std::auto_ptr<BITMAPINFO> pbmi(new BITMAPINFO());

pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = src_width;
pbmi->bmiHeader.biHeight = src_height;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 32;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage =hi*wid*4;


unsigned long pTmpBm[hi*wid];
//unsigned long *pTmpBm=new unsigned long[hi*wid];
for(int i=0;i<hi;i++)
for(int j=0;j<wid;j++)
pTmpBm[i*wid+j]=0x00ff0000;

::StretchDIBits(HTargetDC,
0, 0,
dst_width, dst_height,
0, 0,
src_width, src_height,
pTmpBm,
pbmi.get(),
DIB_RGB_COLORS,
SRCCOPY);

// delete[] pTmpBm;
}

hi=wid最小500,数组算比较大。
两种情况下pTmpBm[i*wid+j]=0x00ff0000赋值都没问题(我调试看过了数组里的值都是正常的),可是在StretchDIBits里调用显示的时候,用new定义的数组就什么都显示不出,非动态定义可以。
是不是内存地址不连续的问题?难道new定义的数组不是连续的一块吗?
jaffy 2006-09-05
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int hi,wid;
hi=100;
wid =2;
unsigned long *pTmpBm=new unsigned long[hi*wid];
delete[] pTmpBm;
}
//---------------------------------------------------------------------------
以上代码在我机器上无问题/
controstr 2006-09-05
  • 打赏
  • 举报
回复
定義時沒有問題
你這種情況是在用new分配內存空間時出現的錯誤,是不是分配的空間太大而內存太小?
jone7319 2006-09-05
  • 打赏
  • 举报
回复
我试过没有问题呀?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧