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 << "\n\tNhap ID  : "; cin >> (*p[i]).ID;
		cout << "\tNhap Ten : ";
		fflush(stdin);
		getline(cin, (*p[i]).Ten);
		cout << "\tNhap Tuoi: "; cin >> (*p[i]).Tuoi;
		cout << "\tDiem HK 1: "; cin >> (*p[i]).HK1;
		cout << "\tDiem 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 << "\n\n\t---SINH VIEN " << i+1 << "---"; 
		cout << "\n\tID       : " << (*p[i]).ID;
		cout << "\n\tTen      : " << (*p[i]).Ten;
		cout << "\n\tTuoi     : " << (*p[i]).Tuoi;
		cout << "\n\tDiem HK 1: " << (*p[i]).HK1;
		cout << "\n\tDiem HK 2: " << (*p[i]).HK2;
		cout << "\n\t=>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 << "\n\n\t\t---SINH VIEN " << i+1 << "---"; 
			cout << "\n\t\tID       : " << (*p[i]).ID;
			cout << "\n\t\tTen      : " << (*p[i]).Ten;
			cout << "\n\t\tTuoi     : " << (*p[i]).Tuoi;
			cout << "\n\t\tDiem HK 1: " << (*p[i]).HK1;
			cout << "\n\t\tDiem HK 2: " << (*p[i]).HK2;
			cout << "\n\t\t=>Diem TB: " << DTB(p[i]);
		}
	}
}

int main() {
	int n;
	cout << "\n\tSo 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 << "\n\n\t---SINH VIEN CO DTB CAO NHAT---";
	cout << "\n\n\t\t---SINH VIEN " << i+1 << "---"; 
	cout << "\n\t\tID       : " << (*p[i]).ID;
	cout << "\n\t\tTen      : " << (*p[i]).Ten;
	cout << "\n\t\tTuoi     : " << (*p[i]).Tuoi;
	cout << "\n\t\tDiem HK 1: " << (*p[i]).HK1;
	cout << "\n\t\tDiem HK 2: " << (*p[i]).HK2;
	cout << "\n\t\t=>Diem TB: " << DTB(p[i]) << endl;
	cout << "\n\n\t---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;
}

Hai câu này không ăn khớp:

for(int i=0; i<n; i++) p[i] = new sinhVien;

 for(int i=0; i < n; i++) delete[] p[i];   `
2 Likes

Xóa [ ] đi đúng không ạ.
Thank bác nhiều nhé. Code chạy bình thường rồi ạ :blush:

new[] phải đi với delete[]
new phải đi với delete.

Bạn bấm tick cho mình nhé :smiley:

2 Likes

Vâng, em hiểu rồi ạ. ĐÃ TÍCH, Giờ mới biết tính năng Solved

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?