2012-12-02 49 views
86

Tôi chỉ đến across this blog post đó đề cập đến “dậm bộ nhớ”:"Bộ nhớ đệm" là gì?

một chương trình C++ đó là dễ dàng có khả năng vượt xa so với bộ nhớ (một cái gì đó bạn có thể chưa bao giờ nghe nói về nếu bạn đã sinh ra ở một mã thế giới quản lý.)

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

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

+4

Một ví dụ hay về bộ nhớ dừng là câu hỏi này: http://stackoverflow.com/questions/31016660/why-is-my-for-loop-not-breaking-code –

Trả lời

109

Bộ nhớ được "dậm" khi một đoạn mã thao túng bộ nhớ mà không nhận ra rằng một đoạn mã khác đang sử dụng bộ nhớ đó theo cách xung đột. Có một số cách phổ biến bộ nhớ có thể được dậm.

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

Người khác đang truy cập bộ nhớ sau khi được giải phóng. Bộ nhớ có thể được cấp phát cho một đối tượng khác. Một lần nữa, mã cho thấy vấn đề 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] (http: // stackoverflow.com/questions/31016660/why-does-this-for-loop-exit-on-some-platforms-and-not-on-others) là ví dụ điển hình về tính năng dồn bộ nhớ. –

32

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

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

sẽ "stomp" trên bất kỳ điều gì xảy ra trong điều tiếp theo trong bộ nhớ sau buffer. Nói chung, 'dậm' là khi bộ nhớ được ghi vào vô ý.

8

Câu trả lời khác về cơ bản là chính xác, 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 có thể dẫn vào vòng lặp vô hạn (hoặc có thể không dẫn), vì đó là hành vi không xác định.

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

Tôi nghĩ đây là ví dụ điển hình cho thấy bộ nhớ "dậm".

+0

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

+1

@Christian Nó không có gì để làm với một hệ điều hành. Đây là một hành vi không xác định. – ST3

Các vấn đề liên quan