我好几天没弄出来,高手救命

fyz2841585 2010-11-16 04:04:56
void CImageWnd::GetImageData(CString strPath)
{
m_strPath = strPath;
CReadDicom readDicom;

CxImage * pImage1=new CxImage;
m_pImage = readDicom.GetDcmLocalImageData(strPath,(CxImage*)&pImage1);
delete pImage1;//在函数外进行new和delete,防止内存泄漏}
CxImage* CReadDicom::GetDcmLocalImageData(CString inPath,CxImage*pImage )
{
pImage = new CxImage;//为什么这行注销了就会运行23行;不注销,就可以正确到20行 BOOL bReVal = FALSE;
BYTE * pDicomDibits = NULL;
int nSize = 0;
pImage->Create(pDicomImg->getWidth(), pDicomImg->getHeight(), 24);
nSize = pDicomImg->createWindowsDIB((void*&)pDicomDibits, 0, 0, 24, 1, 1);
if(nSize == pImage->GetEffWidth() * pImage->GetHeight() && pDicomDibits != NULL)
{
memcpy(pImage->info.pImage, pDicomDibits, nSize);
bReVal = TRUE;//正确 20行
}
else
{
bReVal = FALSE;//不正确 23行
}
return pImage;
}

这行:pImage = new CxImage;不注销的话就内存泄漏啊,该怎么办。
...全文
190 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fyz2841585 2010-11-17
  • 打赏
  • 举报
回复
这个问题我用析构函数把它解决了
dubiousway 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fyz2841585 的回复:]

引用 4 楼 dubiousway 的回复:

下面这几条我觉得有些矛盾?你看看是不是原因?

1。
CxImage * pImage1=new CxImage;// 这里是不是多余?有什么用?

2。
m_pImage = readDicom.GetDcmLocalImageData(strPath,(CxImage*)&pImage1);

这里为什么还要……
[/Quote]

我觉得12楼的改写,理解得很合适,就是不注销 pImage = new CxImage;
函数声明改成GetDcmLocalImageData(CString inPath,CxImage*&pImage )
并且外部声明CxImage * pImage1=NULL;而不是=new CxImage;(你说这是删除,什么意思?)

---------
如果你要注销,不想添加 pImage = new CxImage; 的话
函数声明同上,GetDcmLocalImageData(CString inPath,CxImage*&pImage )
调用的时候
CxImage * pImage1=new CxImage;
m_pImage = readDicom.GetDcmLocalImageData(strPath, pImage1);

------
应该都行。
fyz2841585 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dubiousway 的回复:]

下面这几条我觉得有些矛盾?你看看是不是原因?

1。
CxImage * pImage1=new CxImage;// 这里是不是多余?有什么用?

2。
m_pImage = readDicom.GetDcmLocalImageData(strPath,(CxImage*)&pImage1);

这里为什么还要对pImage1再一次取址?

3。
CxImage*……
[/Quote]
1:这个CxImage * pImage1=new CxImage;表示我在函数外删除pImage1:delete pImage1;
2:是因为别人的函数声明这样写,我直接改错而已。
3:pImage = new CxImage;这句不加上去,根本就显示不了图片。
这第3个问题就是我要问的,如何不添加pImage = new CxImage,又能运行到第20行。
ljwfp 2010-11-16
  • 打赏
  • 举报
回复
CxImage * pImage1=NULL;
m_pImage = readDicom.GetDcmLocalImageData(strPath, pImage1);
CxImage* CReadDicom::GetDcmLocalImageData(CString inPath,CxImage*&pImage )
{
}

我理解你应该用以上实现,这样返回值就是你new出来的对象,他的生命周期取决于你什么时候释放,记得delete就可以了

主要不是很明白,你为什么外面new了一个对象,把他的指针的指针穿进去,然后里面又new一个,感觉有点混乱
daitounaoshi 2010-11-16
  • 打赏
  • 举报
回复
楼主对指针方面的知识掌握的不好,要加强学习
FengRider 2010-11-16
  • 打赏
  • 举报
回复
楼主把指针重新改下吧。
CxImage * pImage1=new CxImage; //这句说明pImage1是一个CxImage的指针
(CxImage*)&pImage1//这里先对pImage1取地址,然后将这个地址又转化成CxImage的指针。这样的调用有点无语。。。。。。
daitounaoshi 2010-11-16
  • 打赏
  • 举报
回复

CxImage* CReadDicom::GetDcmLocalImageData(CString inPath,CxImage*pImage )
{
//pImage = new CxImage; 这里要注释掉
BOOL bReVal = FALSE;
BYTE * pDicomDibits = NULL;
int nSize = 0;
pImage->Create(pDicomImg->getWidth(), pDicomImg->getHeight(), 24);
nSize = pDicomImg->createWindowsDIB((void*&)pDicomDibits, 0, 0, 24, 1, 1);
if(nSize == pImage->GetEffWidth() * pImage->GetHeight() && pDicomDibits != NULL)
{
memcpy(pImage->info.pImage, pDicomDibits, nSize);
bReVal = TRUE;//正确 20行
}
else
{
bReVal = FALSE;//不正确 23行
}
return pImage;
}

ouyh12345 2010-11-16
  • 打赏
  • 举报
回复
或者直接使用成员变量m_pImage
ouyh12345 2010-11-16
  • 打赏
  • 举报
回复
m_pImage = readDicom.GetDcmLocalImageData(strPath);
}//不使用时,删除m_pImage
CxImage* CReadDicom::GetDcmLocalImageData(CString inPath)
{
CxImage *pImage = new CxImage;
...
return pImage;
}
daitounaoshi 2010-11-16
  • 打赏
  • 举报
回复

void CImageWnd::GetImageData(CString strPath)
{
m_strPath = strPath;
CReadDicom readDicom;
CxImage * pImage1=new CxImage;
m_pImage = readDicom.GetDcmLocalImageData(strPath,pImage1); //应该是这样
delete pImage1;//在函数外进行new和delete,防止内存泄漏
}
CxImage* CReadDicom::GetDcmLocalImageData(CString inPath,CxImage*pImage )
{
pImage = new CxImage;//为什么这行注销了就会运行23行;不注销,就可以正确到20行
BOOL bReVal = FALSE;
BYTE * pDicomDibits = NULL;
int nSize = 0;
pImage->Create(pDicomImg->getWidth(), pDicomImg->getHeight(), 24);
nSize = pDicomImg->createWindowsDIB((void*&)pDicomDibits, 0, 0, 24, 1, 1);
if(nSize == pImage->GetEffWidth() * pImage->GetHeight() && pDicomDibits != NULL)
{
memcpy(pImage->info.pImage, pDicomDibits, nSize);
bReVal = TRUE;//正确 20行
}
else
{
bReVal = FALSE;//不正确 23行
}
return pImage;
}
  • 打赏
  • 举报
回复
代码很乱。。。。先整理好代码 再来问吧。
dubiousway 2010-11-16
  • 打赏
  • 举报
回复
下面这几条我觉得有些矛盾?你看看是不是原因?

1。
CxImage * pImage1=new CxImage;// 这里是不是多余?有什么用?

2。
m_pImage = readDicom.GetDcmLocalImageData(strPath,(CxImage*)&pImage1);

这里为什么还要对pImage1再一次取址?

3。
CxImage* CReadDicom::GetDcmLocalImageData(CString inPath,CxImage*pImage )
{
pImage = new CxImage;
。。。。

函数定义里,参数是CxImage*pImage, 那为什么在2的调用里,实际传入的是 CxImage**

既然1 里已经 new CxImage,并传给参数pImage ,为什么3里面又重新pImage = new CxImage;前面的没释放,接着又新new ,是不是这里造成内存泄漏
ouyh12345 2010-11-16
  • 打赏
  • 举报
回复
new了2次
youxidarenzy 2010-11-16
  • 打赏
  • 举报
回复
现上海掌游信息技术有限公司需手机游戏开发工程师,精通c语言,熟悉vc++开发环境,熟悉常用算法的使用,了解游戏框架,了解手机中间件游戏开发更佳。我们是一家快速发展的公司,现在正在组建核心手机游戏团队,如有兴趣请将简历发送至:eva.deng@zyjoy.net ,如果合适我们会尽快联系您!
赵4老师 2010-11-16
  • 打赏
  • 举报
回复

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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