我正在尝试使用谷歌搜索获得的c ++代码加载tga文件,但是分配内存的部分失败了。我的“LoadTarga”方法的开头包括以下变量:
int imageSize;
unsigned char* targaImage;
稍后在方法中,imageSize变量设置为262144,我使用该数字来设置数组的大小:
// Calculate the size of the 32 bit image data.
imageSize = width * height * 4;
// Allocate memory for the targa image data.
targaImage = new unsigned char[imageSize];
if (!targaImage)
{
MessageBox(hwnd, L"LoadTarga - failed to allocate memory for the targa image data", L"Error", MB_OK);
return false;
}
问题是if语句的主体执行,我不知道为什么内存分配失败。据我所知它应该工作 - 我知道代码编译并运行到这一点,我还没有看到谷歌中的任何东西,将显示一个适当的替代品。
我应该在代码中更改哪些内容才能正确分配内存?
重要更新:
Rob的评论和建议非常有用(尽管我尝试使用之前没有尝试_heapchk,因为我解决了这个问题)尝试每一个fritzone的想法意味着该程序没有遇到麻烦就跑过“if(!targaImage)”点。设置“targaImage和if语句检查内存是否正确分配的代码已被替换为:
try
{
targaImage = new unsigned char[imageSize];
}
catch (std::bad_alloc& ba)
{
std::cerr << "bad_alloc caught: " << ba.what() << '\n';
return false;
}
但是下一段代码我遇到了一个新问题:
count = (unsigned int)fread(targaImage, 1, imageSize, filePtr);
if (count != imageSize)
{
MessageBox(hwnd, L"LoadTarga - failed to read in the targa image data", L"Error", MB_OK);
return false;
}
Count给我的值为“250394”,这与imageSize的值“262144”不同。我无法弄清楚为什么会这样做并且做一些搜索(尽管我必须承认,没有多少搜索)“fread”的工作原理并没有产生信息。
我决定取消我的搜索并在教程网站http://www.rastertek.com/dx11s2tut05.html上尝试答案代码(滚动到页面底部显示“源代码和数据文件”并下载zip。但是创建了一个新项目,放入源文件和图像文件不起作用,因为我收到一个新错误。此时我想也许我将图像文件转换为tga的方式可能是不正确的。
因此,我不是花费大量时间来调试答案代码,而是将答案中的图像文件放入我自己的项目中。我注意到我的大小比答案小得多(245KB与1025 KB相比))因此,如果我使用答案代码的图像,我的代码可以正常运行。原来我是对的!现在由于某种原因,图像被横向拉伸,但我的原始查询似乎已经解决了。
感谢Rob L和fritzone的帮助!
答案 0 :(得分:2)
您的样本中没有任何内容看起来错误。现代Windows系统不太可能耗尽内存仅分配256k一次。也许您的分配器在循环中调用并分配比您想象的更多,或者imagesize的值是错误的。查看调试器。
另一种可能性是您的堆已损坏。调用_heapchk()可以帮助诊断它。
答案 1 :(得分:2)
你是 NOT 使用new
的形式,如果出现错误,会返回空指针,因此检查返回值没有意义。相反,你应该知道抓住std::bad_alloc
。为您返回new
的空指针的语法为:new (std::nothrow) unsigned char[imageSize];
请参阅:http://www.cplusplus.com/reference/new/operator%20new[]/
答案 2 :(得分:0)
检查Windows任务管理器中的“内存峰值工作集”,确保您确实要分配多少内存。