我试图用从谷歌搜索得到的 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 L 的评论和建议非常有用(虽然我没有尝试 _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。但是创建一个新项目,放入源文件和图像文件没有工作,因为我收到了一个新错误。在这个point 我想也许我将图像文件从 tga 转换的方式可能不正确。
因此,我没有花大量时间调试答案代码,而是将答案中的图像文件放入我自己的项目中。我注意到我的大小比答案小得多(245KB 比 1025KB)所以如果我使用答案代码的图像我的代码可能会运行良好。事实证明我是对的!现在图像由于某种原因被横向拉伸(stretch)了,但我原来的查询似乎已经解决了。
感谢 Rob L 和 fritzone 的帮助!
最佳答案
您没有使用 new
的形式,它在出错时返回一个空指针,所以检查返回值。相反,您应该注意捕获 std::bad_alloc
。 空指针 返回 new
的语法为:new (std::nothrow) unsigned char[imageSize];
请参阅:http://www.cplusplus.com/reference/new/operator%20new[]/
关于c++ - 使用 new 为 unsigned char 数组分配内存失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35428076/