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;
}
}
Bài liên quan
Đọc sơ qua thì mình thấy code này có một số vấn đề khá nghiêm trọng sau:
p = First
thì vùng nhớ vừa được cấp phát có phải bị lạc mất không?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.
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.
vậy ở dòng 46 cấp phát động mà không xóa thì có ảnh hưởng như thế nào ạ
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ó