C++ 退出代码3(不是我的返回值,正在查找源代码)

C++ 退出代码3(不是我的返回值,正在查找源代码),c++,visual-studio-2008,memory,gmp,C++,Visual Studio 2008,Memory,Gmp,您好 我的程序以代码3退出。没有错误消息,没有异常,退出不是由我的代码启动的 当我试图从文本文件中读取非常长的整数值时,就会出现问题(文本文件已存在并正确打开,且先前读取成功) 我使用了大量内存(事实上,我认为这可能是原因,因为我几乎可以肯定我超过了每个进程2GB的内存限制)。我还使用GMP(或者更确切地说,MPIR)库来乘法bignum。我相当肯定这不是一个文件I/O问题,因为我在完全存储在内存中的以前的程序版本上得到了相同的错误代码 系统: MS Visual Studio 2008 MS

您好

我的程序以代码3退出。没有错误消息,没有异常,退出不是由我的代码启动的

当我试图从文本文件中读取非常长的整数值时,就会出现问题(文本文件已存在并正确打开,且先前读取成功)

我使用了大量内存(事实上,我认为这可能是原因,因为我几乎可以肯定我超过了每个进程2GB的内存限制)。我还使用GMP(或者更确切地说,MPIR)库来乘法bignum。我相当肯定这不是一个文件I/O问题,因为我在完全存储在内存中的以前的程序版本上得到了相同的错误代码

系统:
MS Visual Studio 2008
MS Windows Vista家用高级x86
MPIR 2.1.0 rc2
4GB内存

此错误代码可能来自何处

编辑:这是与代码一起退出的过程

void condenseBinSplitFile(const char *sourceFilename, int partCount){
//condense results file into final P and Q
std::string tempFilename;
std::string inputFilename(sourceFilename);
std::string outputFilename(BIN_SPLIT_FILENAME_DATA2);
mpz_class *P = new mpz_class(0);
mpz_class *Q = new mpz_class(0);
mpz_class *PP = new mpz_class(0);
mpz_class *QQ = new mpz_class(0);
FILE *sourceFile;
FILE *resultFile;

fpos_t oldPos;
int swapCount = 0;
while (partCount > 1){
    std::cout << partCount << std::endl;
    sourceFile = fopen(inputFilename.c_str(), "r");     
    resultFile = fopen(outputFilename.c_str(), "w");
    for (int i=0; i<partCount/2; i++){
        //Multiplication order:
        //Get Q, skip P
        //Get QQ, mul Q and QQ, print Q, delete Q
        //Jump back to P, get P
        //Mul P and QQ, delete QQ
        //Skip QQ, get PP
        //Mul P and PP, delete P and PP

        //Get Q, skip P
        mpz_inp_str(Q->get_mpz_t(), sourceFile, CALC_BASE);
        fgetpos(sourceFile, &oldPos);
        skipLine(sourceFile);
        skipLine(sourceFile);

        //Get QQ, mul Q and QQ, print Q, delete Q
        mpz_inp_str(QQ->get_mpz_t(), sourceFile, CALC_BASE);      
        (*Q) *= (*QQ);
        mpz_out_str(resultFile, CALC_BASE, Q->get_mpz_t());
        fputc('\n', resultFile);
        (*Q) = 0;

        //Jump back to P, get P
        fsetpos(sourceFile, &oldPos);
        mpz_inp_str(P->get_mpz_t(), sourceFile, CALC_BASE);

        //Mul P and QQ, delete QQ
        (*P) *= (*QQ);
        (*QQ) = 0;

        //Skip QQ, get PP
        skipLine(sourceFile);
        skipLine(sourceFile);
        mpz_inp_str(PP->get_mpz_t(), sourceFile, CALC_BASE); 
        //Mul P and PP, delete PP, print P, delete P             
        (*P) += (*PP);
        (*PP) = 0;
        mpz_out_str(resultFile, CALC_BASE, P->get_mpz_t());
        fputc('\n', resultFile);
        (*P) = 0;
    }
    partCount /= 2;

    fclose(sourceFile);
    fclose(resultFile);

    //swap filenames
    tempFilename = inputFilename;
    inputFilename = outputFilename;
    outputFilename = tempFilename;
    swapCount++;
}

delete P;
delete Q;
delete PP;
delete QQ;

remove(BIN_SPLIT_FILENAME_RESULTS);
if (swapCount%2 == 0)
    rename(sourceFilename, BIN_SPLIT_FILENAME_RESULTS);
else
    rename(BIN_SPLIT_FILENAME_DATA2, BIN_SPLIT_FILENAME_RESULTS);
}

这个退出代码似乎是由MPIR(GMP)返回的,因为它无法分配大量内存。不过,有点恼人的是,任何文档中都没有这一点。

您知道它从哪一行退出吗?我们能看到一些代码吗?我不确定退出发生在哪里,但是,我已经粘贴了负责的函数。跟踪它是有问题的,因为这发生在大约3-4小时的计算时间结束时。可能是间接的;你有没有试过在一些东西上运行这段代码,可能是一个文件结构被越界写入所破坏,这是GMP的一个危险。不幸的是,我在尝试运行同一进程的完全内存实现时得到了相同的退出代码(我已经发布了该函数的代码)。对不起,我的观点实际上是我评论的第二部分;您是否尝试过检查超出范围的内存读取/写入?这些通常会导致延迟的、看起来非常随机的错误。(不是segfault,除非它访问应用程序内存之外,而且由于您使用的内存太多,大部分内存都在应用程序中。)在这些情况下,您总是可以检查出什么。
void binarySplitE(const ULONG first, const ULONG last, mpz_class *P, mpz_class *Q){
//P(first, last) = P(first, mid)*Q(mid, last) + P(mid, last)
//Q(first, last) = Q(first, mid)*Q(mid, last)
if (last - first == 1){
    calcP(P, first, last);
    calcQ(Q, first, last);
    return;
}

ULONG mid = (first+last)/2;
mpz_class *PP = new mpz_class(*P);
mpz_class *QQ = new mpz_class(*Q);
//Calculate P(first, mid) and Q(first, mid)
binarySplitE(first, mid, P, Q);
//Calculate P(mid, last) and Q(mid, last)
binarySplitE(mid, last, PP, QQ);

//P(first, last) == P(first, mid)
*P *= (*QQ);
//P(first, last) == P(first, mid)*Q(mid, last)
*P += (*PP);
//P(first, last) == P(first, mid)*Q(mid, last) + P(mid, last);

//Q(first, last) == Q(first, mid)
*Q *= (*QQ);
//Q(first, last) == Q(first, mid)*Q(mid, last)

delete PP;
delete QQ;
}