01/10/2018, 14:53
Lỗi không thể giải phóng con trỏ trong C++
Chào mọi người, em đang làm bài tập đối với con trỏ cấp 2 trỏ tới biến Struct.
Code ở dướt đây chạy gần như bình thường chỉ có 2 dòng cuối cùng dùng để giải phóng con trỏ thì xảy ra lỗi mà em không thể tìm ra nguyên nhân.
Nếu xóa 2 dòng giải phóng đó đi thì code chạy bình thường, còn nếu viết vào thì compile sẽ chạy mãi. Rất mong được mọi người giúp đỡ.
#include <iostream>
#include <string>
using namespace std;
struct sinhVien {
int ID;
string Ten;
int Tuoi;
float HK1;
float HK2;
};
void nhapSV(sinhVien **&p, int n) {
for(int i=0; i<n; i++) {
cout << "
Nhap ID : "; cin >> (*p[i]).ID;
cout << " Nhap Ten : ";
fflush(stdin);
getline(cin, (*p[i]).Ten);
cout << " Nhap Tuoi: "; cin >> (*p[i]).Tuoi;
cout << " Diem HK 1: "; cin >> (*p[i]).HK1;
cout << " Diem HK 2: "; cin >> (*p[i]).HK2;
}
}
float DTB(sinhVien *p) {
float Diem;
return Diem = ((*p).HK1+(*p).HK2)/2;
}
void inSV(sinhVien **p, int n) {
for(int i=0; i<n; i++) {
cout << "
---SINH VIEN " << i+1 << "---";
cout << "
ID : " << (*p[i]).ID;
cout << "
Ten : " << (*p[i]).Ten;
cout << "
Tuoi : " << (*p[i]).Tuoi;
cout << "
Diem HK 1: " << (*p[i]).HK1;
cout << "
Diem HK 2: " << (*p[i]).HK2;
cout << "
=>Diem TB: " << DTB(p[i]);
}
}
int maxDTB(sinhVien **p, int n) {
float M = DTB(p[0]);
int j = 0;
for(int i=0; i<n; i++) {
if(M < DTB(p[i])) {
M = DTB(p[i]);
j = i;
}
}
return j;
}
void SVTienBo(sinhVien **p, int n) {
for(int i=0; i<n; i++) {
if(p[i]->HK1 < p[i]->HK2) {
cout << "
---SINH VIEN " << i+1 << "---";
cout << "
ID : " << (*p[i]).ID;
cout << "
Ten : " << (*p[i]).Ten;
cout << "
Tuoi : " << (*p[i]).Tuoi;
cout << "
Diem HK 1: " << (*p[i]).HK1;
cout << "
Diem HK 2: " << (*p[i]).HK2;
cout << "
=>Diem TB: " << DTB(p[i]);
}
}
}
int main() {
int n;
cout << "
So luong sinh vien: "; cin >> n;
sinhVien **p = new sinhVien*[n];
for(int i=0; i<n; i++) p[i] = new sinhVien;
nhapSV(p, n);
inSV(p, n);
int i = maxDTB(p, n);
cout << "
---SINH VIEN CO DTB CAO NHAT---";
cout << "
---SINH VIEN " << i+1 << "---";
cout << "
ID : " << (*p[i]).ID;
cout << "
Ten : " << (*p[i]).Ten;
cout << "
Tuoi : " << (*p[i]).Tuoi;
cout << "
Diem HK 1: " << (*p[i]).HK1;
cout << "
Diem HK 2: " << (*p[i]).HK2;
cout << "
=>Diem TB: " << DTB(p[i]) << endl;
cout << "
---SINH VIEN TIEN BO---";
SVTienBo(p, n);
cout << endl;
for(int i=0; i<n; i++) delete[] p[i];
delete[] p;
system("pause");
return 0;
}
Bài liên quan
Hai câu này không ăn khớp:
và
Xóa
[ ]
đi đúng không ạ.Thank bác nhiều nhé. Code chạy bình thường rồi ạ
new[]
phải đi vớidelete[]
vànew
phải đi vớidelete
.Bạn bấm tick cho mình nhé
Vâng, em hiểu rồi ạ. ĐÃ TÍCH, Giờ mới biết tính năng Solved