"Dậm bộ nhớ" là gì?


95

Tôi vừa xem qua bài đăng blog này có đề cập đến "trí nhớ đáng nhớ":

một chương trình C ++ có khả năng dễ dàng làm hỏng bộ nhớ (điều mà bạn có thể chưa từng nghe đến nếu bạn sinh ra trong một thế giới mã được quản lý).

Và thực tế là tôi chưa bao giờ nghe nói về nó!

Vì vậy, đây là gì, một bộ nhớ dậm chân, bộ nhớ dậm chân? Nó xảy ra khi nào?


4
Một ví dụ điển hình về sự sụt giảm trí nhớ là câu hỏi này: stackoverflow.com/questions/31016660/…
Phillip Ngan

Câu trả lời:


117

Bộ nhớ bị "dậm chân tại chỗ" khi một đoạn mã điều khiển bộ nhớ mà không nhận ra rằng đoạn mã khác đang sử dụng bộ nhớ đó theo cách gây xung đột. Có một số cách phổ biến mà bộ nhớ có thể bị thay đổi.

Một là cấp phát 100 byte bộ nhớ nhưng sau đó lưu trữ một cái gì đó vượt quá địa chỉ thứ 100. Bộ nhớ này có thể được sử dụng để lưu giữ một cái gì đó hoàn toàn khác. Điều này đặc biệt khó gỡ lỗi vì sự cố sẽ xuất hiện khi một thứ gì đó cố gắng truy cập vào nạn nhân đã bị dẫm phải và đoạn mã bị dẫm lên đó có thể hoàn toàn không liên quan.

Một cách khác là truy cập bộ nhớ sau khi nó được giải phóng. Bộ nhớ có thể được cấp cho một đối tượng khác. Một lần nữa, mã hiển thị sự cố có thể liên quan đến đối tượng mới được cấp phát có cùng địa chỉ và không liên quan đến mã gây ra sự cố.


3
Đây là một ví dụ tuyệt vời về việc tăng tốc bộ nhớ.
patryk.beza

33

Rất thường xuyên đó là một bộ đệm bị tràn; như một ví dụ, mã này:

char buffer[8];
buffer[8] = 'a';

sẽ "dậm chân tại chỗ" bất cứ điều gì xảy ra trong điều tiếp theo trong bộ nhớ sau đó buffer. Nói chung, 'dậm chân tại chỗ' là khi bộ nhớ được ghi vào một cách không chủ ý.


9

Các câu trả lời khác về cơ bản là đúng, nhưng tôi muốn đưa ra một ví dụ.

int a[10], i;       
for (i = 0; i < 11 ; i++)
    a[i] = 0;

int i, a[10];     
for (i = 0; i < 11 ; i++)
    a[i] = 0;

Những mẫu này có thể dẫn đến vòng lặp vô hạn (hoặc có thể không dẫn), bởi vì nó là hành vi không xác định.

Rất có thể biến itrong bộ nhớ được lưu trữ ngay sau mảng. Vì vậy, truy cập a[10]thực sự có thể truy cập, inói cách khác, nó có thể đặt lại bộ đếm vòng lặp.

Tôi nghĩ đó là một ví dụ điển hình chứng tỏ trí nhớ “dậm chân tại chỗ”.


1
Có một chủ đề bao phấn, thảo luận khá nhiều về cùng một ví dụ trên hệ điều hành khác nhau ... stackoverflow.com/questions/31016660
Christian

2
@Christian Nó không liên quan gì đến hệ điều hành. Đây là một hành vi không xác định.
ST3
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.