30/09/2018, 20:23

Cấp phát bộ nhớ trong c/c++

Bác nào giúp em với, cái devCpp của em nó bị điên loạn mất rồi, kết quả ra lung tung.
Bác nào chạy hộ đoạn này phát.

#include <stdio.h>
#include <stdlib.h>
int main(){
	int a=10;
	int *p;
	p=(int *)malloc(sizeof(int));
	p=&a;
	printf("%d 
",*p);
	printf("Giai phong p
");
	free(p);
	printf("%d
",*p);
	printf("giai phong lan nua p");
	free(p);
}
*grab popcorn* viết 22:24 ngày 30/09/2018

p = (int *)malloc(sizeof(int));
-> p đc trỏ tới vùng nhớ đc cấp phát

p = &a;
-> p trỏ tới a.
~> vùng nhớ đc cấp phát bây giờ đang long nhong ngoài đó…

Hoàn Vũ viết 22:27 ngày 30/09/2018

Lâu không mó vào c/c++ rối mù hết lên.

Hoàn Vũ viết 22:31 ngày 30/09/2018

Mình muốn cấp phát 1 con trỏ, rồi giải phóng nó 2 lần xem xuất hiện lỗi như thế nào thôi @@

*grab popcorn* viết 22:23 ngày 30/09/2018

Nếu không nhầm là sẽ bị lỗi ngay.
Vì khi free, thì chương trình hú hệ điều hành đánh dầu vùng nhớ này không ai dùng nữa.
Vậy nên khi free lần nữa, ctrinh hú lần nữa. Hệ điều hành lúc này kiểu sẽ không hiểu tại sao đánh dấu free rồi mà kêu đánh dấu nữa ~> bối rối ~> chửi ~> lỗi :))

Anyway, cái trên bạn đang trỏ vào stack ((tro vào biến a), trong stack có cơ chế free khác (thay đổi giá trị của thanh ghi ESP thì phải, mình ko rành lắm) Vậy nên khi bạn dùng free như trên nên bị sai ~> crash
Muốn thử thì bạn bỏ dòng p = &a; đi thử là ok.

Hoàn Vũ viết 22:24 ngày 30/09/2018

Nếu mình đang làm demo cho cái lỗi này @@

Bé tập Code viết 22:28 ngày 30/09/2018

Sau khi giải phóng vùng nhớ đã được cấp động thì “vùng nhớ” đó sẽ là Undefined Behavior. Bất kì điều gì bạn làm trên vùng đó (chẳng hạn như free tiếp) đều là vô nghĩa.

Bài liên quan
0