gpt4 book ai didi

c++ - Windows 7 64 位 C++ malloc 失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:25 25 4
gpt4 key购买 nike

我有一个小型 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;
}

最佳答案

谢谢大家

原来我是在分配的内存之外写的(有点 x 和 y 的混淆)。奇怪的是,该程序一直运行到现在(24/7 好几个月)并且按照我的预期进行。它可以解释一些我无法解释的奇怪事情。

现在我无论如何都会用标准的 C++ 内存分配重写代码。

关于c++ - Windows 7 64 位 C++ malloc 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15659983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com