Windows 7 64位c ++ malloc失败

时间:2013-03-27 13:25:54

标签: c++ malloc windows-7-x64

我有一个小的 c ++ 程序,无法使用malloc分配超过2880个。声明:

void* tmpptr = malloc(2881);

崩溃,而

void* tmpptr = malloc(2880);

。每一次!

我正在使用MinGW并使用

进行编译
g++ -std=c++0x -pedantic -Wall -Wextra -g -D_GLIBCXX_DEBUG -static-libgcc -static-libstdc++

我知道在C ++中不鼓励使用malloc,我打算重写这个,但我仍然想知道为什么这不起作用。当我用gcc编译它时,相同的代码一直在工作。

更新: 这是主要的函数调用:

image * img = readPPM("pic/pic.ppm");
bw_image * sky = skyline(img, ref);
cont * lin = contour(sky, 0); // <-- chash
...

该功能以:

开头
#include <cstdlib>
cont * contour(const bw_image * img, const char wrap) {
    int test = 2880;
    void* ptr1 = malloc(test);
    void* ptr2 = malloc(test);
...

现在第一个malloc将起作用,但不起作用。如果我更改test = 1440;,结果相同。但;对于test = 140;,第一个malloc将失败。

我已经尝试过代码了:

int main(int argc, char *argv[]) {
    int size = 2881;
    void* tmpptr;
    printf("Allocating, %d\n", size);
    tmpptr = malloc(size);
    printf("Allocated %d bytes successfully\n", size);
}

并且它没有问题,所以它似乎是main做的事情。

rem_artifacts看起来像这样

void rem_artifacts(bw_image * sky) {
    for (int y = 0; y < sky->y; ++y) for (int x = 0; x < sky->x; ++x) {
        int xp = x - 1, xn = x + 1;
        if (xp < 0) xp = sky->x - 1;
        if (xn == sky->x) xn = 0;
        int c = sky->data[x][y];  // this is wrong
        if (
            (y == 0 || sky->data[x][y-1] != c) &&  // and this
            (y == sky->y-1 || sky->data[x][y+1] != c) && // and this
            sky->data[xp][y] != c &&  // and this
            sky->data[xn][y] !=c  // and this
        ) sky->data[x][y] = !c; // and this
    }
}
bw_image * skyline(const image * img, const image * ref) {
    double tilt = 114.0 - 90.0;
    double pi = 3.14159265358979323846;
    double chang = 360.0 / 2.0 / pi;
    //double sint = sin(tilt / chang);
    //double cost = cos(tilt / chang);
    bw_image * sky = (bw_image*)malloc(sizeof(bw_image));
    sky->x = img->x;
    sky->y = img->y;    //  
    double cos30 = sqrt(3)/2;
    int lim0 = (int)((double)(img->y) / 2.0 + (double)(img->x) * tan(tilt/chang) * cos30);
    sky->data = (char**)malloc(sizeof(char*) * sky->y);
    for (int y = 0; y < sky->y; ++y) {
        sky->data[y] = (char*)malloc(sizeof(char) * sky->x);
        for (int x = 0; x < sky->x; ++x)
            sky->data[y][x] = !(y < lim0 && colour_dist_sq(img->data[y][x], ref->data[y][x]) < 5000.0);
    }
    rem_artifacts(sky);
    return sky;
}

3 个答案:

答案 0 :(得分:1)

谢谢大家,

事实证明,我是在分配的内存之外写的(有点像x和y的混淆)。奇怪的是,该程序一直运作到现在(24/7多月)并做了我一直期待的事情。它可以解释一些我无法解释的奇怪的事情。

现在我将用标准C ++内存分配重写代码。

答案 1 :(得分:0)

在我看来,你的程序堆中的堆已经损坏了(可能是在main中的那个大循环中。你要做的第一件事就是开始启用警告-Wall和{{ 1}}至少然后修复它们。

如果您可以访问Linux,最好的办法是在valgrind下运行它,并且会惊讶于它会告诉您确切地覆盖内存的位置。

或者,如果您可以访问Windows上的Purify($$$),也可以帮助您。还有一些内存检查可以使用malloc库。

如果这些工具都不可用,您将不得不通过尝试删除代码段并查看它是否仍然崩溃来自行进行诊断。

答案 2 :(得分:0)

如果我冒昧地猜测,那就是你没有正确地分配sky->data或它的子指针。

这必须分两步完成:

  1. 首先分配sky->data

    sky->data = new char*[some_x_size];
    
  2. 然后你必须分别分配所有子数组:

    for (int x = 0; x < some_x_size; x++)
        sky->data[x] = new char[some_y_size];
    
  3. 您当然可以使用malloc代替new

    当释放数据时,你会采用相反的方式:先在循环中释放每个子数组,然后释放主数组。