c++ - 如果引入一对以上的数据,为什么这个程序会崩溃?

标签 c++ arrays

我正在编写程序来引入一个动态分配的数组,然后打印它。如果我只引入一组值,一切都很好,但如果我引入超过一对值,程序就会崩溃。

#include <iostream>
#include <stdlib.h>

using namespace std;

int *a, *b, m;
void askData(int **a, int **b);
void printData(int **a, int **b);

int main(){

    bool control = true;

    do{
        cout <<" ************* MENU ************* "<< endl;
        cout <<"    1.-  Ask for values  "<< endl;
        cout <<"    2.-  Print values  "<< endl;
        cout <<"    3.-  Exit "<< endl;

        cout << "Select one option: " << endl;
        int n;
        cin >> n;

        switch(n){
        case 1:
            askData(&a,&b);
            cout << endl;
            break;
        case 2:
            printData(&a,&b);
            break;
        default:
            cout << "Exit" << endl;
            break;
        }

        system("pause");
        system("cls");
        if(n == 3){
            control = false;
        }
    }while(control);
    return 0;
}

void askData(int **a, int **b){
    cout << endl << "Enter the number of pairs of data: ";
    cin >> ::m;
    int z = ::m;

    *a = new int[z];
    *b = new int[z];

    for(int i=0; i<z; i++){
        cout << "Enter V[" << i <<"], Enter T[" << i << "]:?";
        cin >> *a[i] >> *b[i];
    }

    delete [] a;
    delete [] b;
}

void printData(int **a, int **b){
    for(int i=0; i < m; i++){
        cout << *a[i] << " " << *b[i] << endl;
    }
}

最佳答案

您正在尝试在释放内存后读取内存(悬挂指针),这将有未定义的行为

您的函数 askData 正在分配内存并填充数据。但是在该函数的末尾,您将释放存储在全局变量 a & < em>b

现在在 printData() 函数中,您正在传递要读取的已释放内存指针。这会导致问题。

编辑1

我们应该避免使用裸指针而不是使用C++提供的智能指针。在这种情况下,您不必担心手动内存管理。

EDIT2

您的程序正在尝试写入 ab(这是指向指针的指针)。无论如何,对于您的程序,您可以删除传递给不同函数的参数,因为它们是全局变量。但我建议您开始使用 std::vectorsmart_pointer

从 ISOCPP FAQ 链接中了解如何使用这些概念:

http://isocpp.org/wiki/faq/freestore-mgmt#memory-leaks

void askData(){
    a = new int[z];
    b = new int[z];
    for(int i=0; i<z; i++){
        cout << "Enter V[" << i <<"], Enter T[" << i << "]:?";
        cin >> a[i] >> b[i];
    }
}

void printData(){
    for(int i=0; i < m; i++){
        cout << a[i] << " " << b[i] << endl;
    }
    delete [] a;
    delete [] b;
}

关于c++ - 如果引入一对以上的数据,为什么这个程序会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23097486/

相关文章:

c++ - 英特尔 C++ 编译器错误? (指针别名)

c++ - Windows Media Foundation 枚举音频设备

java - 重新调整数组大小(如扩展和图像)- Java

python - 查找数字是否在特定范围内python

ios - 如何保存组装好的 NSArray?

c - 如何以及为什么使用 c 中的 sizeof(a)/sizeof(a[0]) 来计算数组中的元素数

c++ - 不同步读写SysV共享内存(使用信号量,C/C++,Linux)

c++ - 函数返回后,指向字符串文字的指针是否仍然有效?

c++ - 循环遍历堆栈中的底片

arrays - Swift 字典扩展数组 sortInPlace