Chỗ này sai
=> Stack là vùng nhớ do CPU quản lý, lập trình viên không thể can thiệp vào, nếu cố tình can thiệp sẽ bị lỗi. Vùng nhớ này chứa các biến cục bộ (biến được bao phủ bởi dấu {} ).
Chỗ này sai
=> Stack là vùng nhớ do CPU quản lý, lập trình viên không thể can thiệp vào, nếu cố tình can thiệp sẽ bị lỗi. Vùng nhớ này chứa các biến cục bộ (biến được bao phủ bởi dấu {} ).
Ngắn gọn đầy đủ
Stack vs Heap Pros and Cons
Stack
Heap
Chỗ này cũng không ổn, nó bị giới hạn bởi số lượng vùng nhớ vật lý (RAM, …), ngoài ra nó còn bị giới hạn lúc bộ nhớ bị phân mảnh nữa, tức là bộ nhớ còn lại là 1GB nhưng bị phân mảnh thì không thể cấp phát một vùng nhớ liên tục 1GB được
nếu zo project lớn thì lâu lâu lại quên, có hàm nào duyệt memory leak ko nhỉ
Uầy, tự nhiên có ai đào mộ, vô đây mới thấy có người reply câu trả lời của mình !
Cho em xin ý kiến của anh @tranhuanltv vì sao nó sai ạ
Vì mình hoàn toàn có thể tạo một vùng nhớ trên stack và thay đổi giá trị của nó
VD:
void doSomething()
{
char buffer[256];
buffer[0] = '\0';
}
buffer ở đây được khởi tạo trên stack
Tức là sai chỗ này ạ ?
Hmm, tức là có thể can thiệp chứ không phải “không thể can thiệp vào”
“Can thiệp” nó nghĩa khác anh ạ
VD:
int x;
int *y = &x;
delete y;
Giả sử cho biến kiểu int
là x
, con trỏ int
là y
trỏ đến x
=> x
và y
đang nằm trong stack
Bây giờ mình mà giải phóng con trỏ y thì đó mới gọi là “can thiệp” đại loại là như thế
Nên khi để delete y
hoặc free(y)
thì chương trình báo lỗi ngay
Xin ý kiến của anh ạ
Vậy thì nên sử dụng “bị hạn chế” thay vì “không thể can thiệp”. Bất kì hành vi nào có thể làm thay đổi stack thì cũng là “can thiệp” rồi
Vậy khi nào dùng stack,khi nào dùng heap ạ? Với kiến thức em hiện giờ thì dùng heap khi không biết kích cỡ của input, nhưng mình có thể sửa bằng cách dùng mảng động phải không ạ #@@
P/s: em không cố ý đào mộ đâu
gọi hàm đệ quy circle() sẽ gây stack overload.Em hiểu là bác biến cục bộ và tham số truyền vào hàm sẽ lưu vào stack nhưng ở đây chương trình không khởi tạo một biến cục bộ và một tham số truyền vào nào.Vậy gây nên stack overload ở đây là gì ạ.Em cảm ơn
Địa chỉ hàm gọi cũng được tính là chi phí trong 1 stack frame.
Khi gọi hàm thì phải push địa chỉ trở về vào stack.