Malloc调用崩溃,但在其他地方工作

Posted

技术标签:

【中文标题】Malloc调用崩溃,但在其他地方工作【英文标题】:Malloc call crashing, but works elsewhere 【发布时间】:2012-02-04 09:42:17 【问题描述】:

我想知道是否有人对此有任何见解......

我的程序在这个调用上崩溃了:

void subtract(data* array,data* inverse,int a, int b, int q, int n)


data* arraytomultiply;
arraytomultiply = (data *)malloc(sizeof(data*) * n);

其中 data 只包含一个 int (这是为了以后切换类型时方便)

typedef struct  
        int value;
data;

我在这里尝试了很多改变指针的方法,因为我对它们一点信心都没有,但无济于事。

奇怪的是,在程序的早期,这个相同的调用起作用了,我给它赋值并可以打印出来,一切都......:

data* array;
array = (data*)malloc(sizeof(data*) * m * n); // m * n entries

可能有用的一件事(虽然我不知道为什么)是它在早期工作时是在一个 void 函数期间,而当它崩溃时它是在一个从算法中调用的函数中。但我根本看不出这会如何影响它,因为我想要做的不是使用任何参数等......

有什么想法吗?

【问题讨论】:

malloc 崩溃时,几乎总是因为内存早早损坏。我敢打赌,数据是在之前malloced 的数据块之前或之后写入的。 啊,大概是这样吧,我会回去查看之前的 malloc 并检查它们,谢谢 :) 你有崩溃的核心文件吗?如果这样做,并且粘贴回溯,这将有助于诊断问题。 您可能希望在要减去的调用中检查 n 的值。检查它是否符合合理的限制。除了内存损坏之外,当分配的字节数由于某些未初始化的变量而导致分配的字节数非常大时,我已经看到此失败。由于 n 是从函数调用中传入的,因此检查它的值是一种很好的编程习惯。 dbeer,我该如何找到它?我通常使用 GDB 进行调试,但我最近不得不使用 VS 2010 切换到 Windows - 这是我第一个使用它的程序! Lou:谢谢,但是 n 是由用户在开始时设置的,并在程序中执行.. 【参考方案1】:

不应该是 sizeof(data) 而不是 sizeof(data*) 因为您正在为数据结构分配空间?

【讨论】:

谢谢,不过我又试了一次,还是一样的崩溃。也许我的 malloc 正在尝试分配已经在使用的空间或其他什么? 如果实际 malloc() 调用如您在标题中所说的那样崩溃,您很可能已经覆盖了堆的一部分,要么在某处分配了太少的内存,要么使用了已经被释放了。我会在 malloc() 崩溃之前查看 malloc() 内存的最新使用情况。 谢谢,我认为这是最好的方法,我正在经历它! 感谢 Joachim;原来是在别处,我只是在 for 循环中输入了一个太大的数字,所以它试图在我猜没有分配内存的地方输入整数,这导致了后来的崩溃。结果很傻,但这是一次很好的学习经历,很高兴知道我分配了太多内存!【参考方案2】:

您分配的是data *m * n 元素,而不是data。如果您想要指向data 的指针数组,那么您在malloc() 中所做的操作是正确的,但应该分配给data **

array = (data*)malloc(sizeof(data*) * m * n); // m * n entries

应该是

array = (data*)malloc(sizeof(data) * m * n); // m * n entries

而且,您应该始终检查malloc() 的返回值,以确定它是失败还是成功!

if ((array = (data*)malloc(sizeof(data) * m * n)) == NULL) 
    printf("unable to allocate memory");
    return; // you can return your error code here!


您的程序完全有理由崩溃。但是当你说,it worked earlier but crashed later 做了一些实验。我尝试了您的代码 sn-p 并发现它对我有用。我尝试了很多次,但它从未崩溃过。我很困惑,我发布了一个问题来找出原因?! - 可以在这里找到Are "malloc(sizeof(struct a *))" and "malloc(sizeof(struct a))" the same?

+1 回答你的问题!

【讨论】:

呵呵,很高兴看到有什么东西出来了 :) 不错。这个问题有一个很好的解释。请检查!每天都要学习一些新东西:)【参考方案3】:

你们都是对的,但无论如何我想知道为什么会崩溃。

我想知道,因为data(如上定义)的大小预计小于或等于data* 的大小。

【讨论】:

是的,我就是这么想的,我知道为什么反过来会出错,但是为什么分配的空间比需要的多时会崩溃..【参考方案4】:

当 malloc 崩溃时,通常是因为您弄乱了它用来跟踪其他地方堆上内存的结构。你的程序是多线程的吗?尝试使用 helgrind 或 drd(两种 valgrind 工具)运行它。这些可以帮助您跟踪竞争条件、未受保护的数据访问或其他线程问题。

【讨论】:

嗨,dbeer,到目前为止,我的程序不是多线程的,当我将这个新数组传输到 GPU 进行计算时,它是多线程的,但在这个版本中它没有创建它.奇怪的是,整个事情在 2d 中运行良好,但我正在尝试展平我的阵列,因为这样更容易将它们移动到 GPU ..

以上是关于Malloc调用崩溃,但在其他地方工作的主要内容,如果未能解决你的问题,请参考以下文章

添加一个函数调用时应用程序幻象崩溃

malloc啥时候不调用mmap?

在 Linux (Servicemix) 下运行时在工作表上调用 autoSizeColumn 时崩溃

从第三方 DLL 调用 Qt 中的函数在调试模式下工作,在发布时崩溃

在 C++ 中调用 free() 在调试中触发 ntdll!DbgBreakPoint() 但在发布时崩溃

Android malloc_debug介绍