内存错误:取消引用空指针/ SSE未对齐

时间:2012-05-17 16:33:40

标签: c++ linux

我正在编译远程linux服务器上的程序。该计划编制。但是,当我运行它时,程序突然结束。所以我用DDT调试了程序。它吐出以下错误:

    Process 0:
    Memory error detected in ClassName::function (filename.cpp:6462).
    Thread 1 attempted to dereference a null pointer or execute an SSE instruction with an 
    incorrectly aligned memory address (the latter may sometimes occur spuriously if guard 
    pages are enabled)
    Tip: Use the stack list and the local variables to explore your program's current 
    state and identify the source of the error.

任何人都可以告诉我这个错误究竟意味着什么?

程序停止的行如下所示:

    SumUtility = ParaEst[0] + hhincome * ParaEst[71] + IsBlack * ParaEst[61] + IsBachAss * (ParaEst[55]);

这是一个转换案例。

这些是变量类型

    vector<double> ParaEst;
    double hhincome;
    int IsBlack, Is BachAss;

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

这意味着:

  1. ParaEst为NULL或指针错误
  2. ParaEst的各个数组值未与SSE所需的16字节边界对齐。
  3. hhincome,IsBlack或IsBachAss未与16字节边界对齐,并且是SSE类型值。
  4. SumUtility未与16字节对齐,是SSE类型字段。
  5. 如果您可以发布失败的确切行的汇编代码以及该汇编行的寄存器值,我们可以准确地告诉您上述哪些条件失败了。它还有助于查看每个变量的类型,以帮助缩小原因。

答案 1 :(得分:0)

好的......问题终于得到了解决。

问题在于代码分解的表达式是新定义的函数。但是,由于某些奇怪的原因,运行make文件并未包含这些更改,并且仍在使用以前编译的.o文件进行编译。这导致将垃圾值分配给此新函数中的变量。最重要的是程序调用此函数作为第一步。因此存在这种系统性崩溃。这方面的技术方面是迈克尔提到的。

在此之后,我总是建议在make文件中使用make clean选项。为什么运行make文件无法编译修改后的源文件的问题是一个肯定值得进一步讨论的问题。

感谢您的回复!!