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;
}
rogp10 viết 17:06 ngày 01/10/2018

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];   `
Quang Vu viết 17:07 ngày 01/10/2018

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

rogp10 viết 16:53 ngày 01/10/2018

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

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

Quang Vu viết 17:02 ngày 01/10/2018

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

Bài liên quan
0