我正在编写程序来引入一个动态分配的数组,然后打印它。如果我只引入一组值,一切都很好,但如果我引入超过一对值,程序就会崩溃。
#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
您的程序正在尝试写入 a 和 b(这是指向指针的指针)。无论如何,对于您的程序,您可以删除传递给不同函数的参数,因为它们是全局变量。但我建议您开始使用 std::vector 和 smart_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/