c++ - 使用 new 为 unsigned char 数组分配内存失败

标签 c++ arrays memory-management

我试图用从谷歌搜索得到的 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/

相关文章:

c++ - 在 Eclipse 中使用 C++ 在 Linux 中获取环境变量 $PATH

c++ - LNK2019 - 未解析的外部符号

javascript - 为什么我不能删除这个对象的类/属性

Delphi,FastMM - block 在被释放后已被修改 - 需要帮助解释此 FastMM 报告

iphone - tableviewDataSource 中的内存管理

c++ - "placement new"有什么用?

c++ - 错误 : invalid conversion from ‘char*’ to ‘char’ [-fpermissive]

c++ - 找到具有非线性级数的最接近值

javascript - 正确使用推送的数组长度问题

java - 在 n 个二维数组中搜索