30/09/2018, 23:40

Cho em hỏi về giải phóng vùng nhớ trong cấp phát động với ạ

code của em đây ạ
tại sao khi có thêm dòng số 50 và 51 lúc chạy chương trình bị đứng ạ
em tưởng sau khi sử dụng xong thì mình cứ delete nó đi chứ.
Mọi người giải thích giúp em với ạ

http://codepad.org/JWowYLFW

#include <iostream>
using namespace std;

struct Interger{
	int giaTri;
	Interger *Next;
};
Interger *First;

void Interger_Insert_First();
void Interger_Insert_End();
void Show_List_Interger();
int main() {
	First = NULL;
	if (First == NULL){
		Interger_Insert_First();
	}

	Interger_Insert_End();
	Show_List_Interger();
	
	
	system("pause");
}

void Interger_Insert_First(){
	int _giaTri;
	cout << "Gia tri can them vao dau la: ";
	cin >> _giaTri;
	Interger *p = new Interger;
	p->giaTri = _giaTri;
	p->Next = First;
	First = p;
	
}

void Interger_Insert_End(){
	int _giaTri;
	cout << "Gia tri can them vao cuoi la ";
	cin >> _giaTri;
	Interger *p = new Interger;
	p = First;
	while (p->Next != NULL){
		p = p->Next;
	}
	Interger *q = new Interger;
	q->giaTri = _giaTri;
	q->Next = p->Next;
	p->Next = q;
	delete q; q = NULL; // 
	delete p; p = NULL; //
}

void Show_List_Interger(){
	Interger *p = new Interger;
	p = First;
	while (p != NULL){
		cout << p->giaTri << " ";
		p=p->Next;
	}
	
}
Khánh Nguyễn viết 01:54 ngày 01/10/2018

Đọc sơ qua thì mình thấy code này có một số vấn đề khá nghiêm trọng sau:

  • Dòng 41 bạn không cần phải cấp phát cho p. Vì cấp phát như bạn làm, sau đó lại gán p = First thì vùng nhớ vừa được cấp phát có phải bị lạc mất không?
  1. Không cần dòng 50, 51. Sau khi chương trình chạy hết dòng 49, thì ta có thể hình dung bộ nhớ như sau:

Dòng 50, 51 của bạn sẽ giải phóng đi 2 vùng này. Khi đó con trỏ First sẽ trỏ vào một vùng nhớ đã được giải phóng và vùng nhớ này có thể đang được những chương trình khác sử dụng không chừng.

  • Dòng 55 không cần. Tương tự như mục 2, bạn cấp phát một vùng nhớ rồi lại trỏ con trỏ sang chỗ khác, bỏ mặc vùng nhớ đó. Quá nguy hiểm.

Bạn nên đọc kĩ và cố hiểu rõ về vấn đề nãy. Theo mình thấy bạn còn hơi mơ hồ trong vấn đề cấp phát động.

beginner viết 01:48 ngày 01/10/2018

vậy ở dòng 46 cấp phát động mà không xóa thì có ảnh hưởng như thế nào ạ

Nguyễn Xuân Phúc viết 01:50 ngày 01/10/2018

không nhé, và cũng không được phép xóa luôn
vì lúc này nó đang nằm trong list, vẫn đang được quản lý và sử dụng
bạn xóa đi thì sẽ khiến linked list sinh lỗi
nó vẫn còn đang được dùng thì sao lại giết nó

Bài liên quan
0