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

时间:2016-02-16 09:04:59

标签: 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的评论和建议非常有用(尽管我尝试使用之前没有尝试_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的帮助!

3 个答案:

答案 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任务管理器中的“内存峰值工作集”,确保您确实要分配多少内存。