簡體   English   中英

為什么幾次運行后我的程序崩潰?

[英]Why does my program crash after a few runs?

我對C ++相當陌生。 我的程序似乎可以正常編譯,但是每4-5次運行就會崩潰。 在最初的幾次運行中,它似乎運行良好,但是過了一會兒,我將收到一個錯誤消息,並且我的程序將停止工作。

這就是它在調試器中告訴我的內容,但是我不知道是哪一行導致了崩潰。 我相信我沒有正確刪除動態分配的內存或試圖訪問空指針。 我一直在拔頭發,但不能把頭纏住。

在此處輸入圖片說明

#include <iostream>
using namespace std;


int** test(int*, int);

int main() {
    int arr[3] = { 135, 3028063, 247777 };
    int** p = test(arr, 3);
    int count = 0;
    const int size2 = 10;

    for (int i = 0; i < size2; ++i) {
        if (p[0][i] == 1) {
            cout << i << " occurs " << p[1][i] << " times." << endl;
        }
    }

    return 0;

}

int** test(int* ary, int size) {
    int i, j;
    int tmp;
    int** tmpAry;
    const int size2 = 10;
    tmpAry = new int*[size];
    int totals[size2] = { 0 };
    int* uncommons = new int[size2]();
    int** a = new int*[size2];

    for (i = 0; i < size; i++) {
        tmpAry[i] = new int[size2 + 1]();
        tmp = ary[i];
        if (tmp < 0)
            tmp = -tmp;

        while (tmp != 0) {
            tmpAry[i][tmp % 10]++;
            totals[tmp % 10]++;
            tmp /= 10;
        }
    }

    for (i = 0; i < size; i++) {
        for (j = 0; j < size2; j++) {
            if (tmpAry[i][j] != 0 &&
                tmpAry[i][j] == totals[j]) {
                uncommons[j]++;
                tmpAry[i][size2] += tmpAry[i][j];
            }
        }
    }

    for (int i = 0; i < size2; i++) {
        a[i] = new int[2]();
    }


    // pointers to parts
    int* array1 = a[0];
    int* array2 = a[1];

    // fill "arrays"
    for (i = 0; i < size2; ++i) {
        if (uncommons[i])
        array1[i] = uncommons[i];
    }
    for (i = 0; i<size2; ++i) {
        array2[i] = totals[i];
    }

    return a;
    for (int i = 0; i < size2; i++) {
        delete[] a[i];
    }
    delete[] a;
}

誰能幫我指出我的錯誤? 謝謝你的時間。

您永遠不會delete任何內容,因為您在碰到該代碼之前會先return 因此,您會遇到內存泄漏,最終導致程序崩潰。 你會好得多使用智能點,或更好的標准容器,比如一個std::vectorstd::array

看來問題出在數組a的邊界之外。 參見, a是一個10x2的數組。

const int size2 = 10;
int** a = new int*[size2];

for (int i = 0; i < size2; i++) {
    a[i] = new int[2]();
}

int* array1 = a[0];
int* array2 = a[1];

array1是大小為2的數組

// fill "arrays"
for (i = 0; i < size2; ++i) {
    if (uncommons[i])
    array1[i] = uncommons[i];
}
for (i = 0; i<size2; ++i) {
   array2[i] = totals[i];
}

在那里您寫入array1[2], array1[3], ... array2相同。

如果程序不時崩潰,則很有可能出現內存損壞問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM