Về lý do tại sao 0x0C
có vẻ phổ biến hơn 0x08
(thực sự là vậy? Tôi không biết; và trong các loại ứng dụng nào?), Điều này có thể phải làm với các con trỏ bảng phương thức ảo. Đây thực sự là một nhận xét nhiều hơn (đoán đại chúng hoang dã :), nhưng nó có phần lớn hơn, vì vậy hãy đến đây ... Nếu bạn có một lớp học với các phương thức ảo, các trường riêng của nó sẽ bị thay đổi 0x04
. Ví dụ, một lớp kế thừa từ một lớp ảo khác có thể có bố cục bộ nhớ như thế này:
0x00 - VMT pointer for parent
0x04 - Field 1 in parent
0x08 - VMT pointer for child
0x0C - Field 1 in child
Đây có phải là một kịch bản phổ biến, hoặc thậm chí đóng? Tôi không chắc. Tuy nhiên, lưu ý rằng trong ứng dụng 64 bit, điều này thậm chí có thể chuyển sang 0x0C
giá trị thú vị hơn :
0x00 - VMT parent
0x08 - Field 1 parent
0x0C - VMT child
0x14 - Field 2 child
Vì vậy, thực sự có rất nhiều trường hợp các ứng dụng có thể có sự chồng chéo đáng kể trong các con trỏ null. Nó có thể là trường đầu tiên trong lớp con hoặc con trỏ bảng phương thức ảo của nó - cần thiết bất cứ khi nào bạn gọi bất kỳ phương thức ảo nào trên một cá thể, vì vậy nếu bạn gọi một phương thức ảo trên một null
con trỏ, bạn sẽ bị vi phạm quyền truy cập trên nó VMT bù. Sự phổ biến của giá trị cụ thể này sau đó có thể có liên quan đến một số API phổ biến cung cấp một lớp có kiểu kế thừa tương tự, hoặc nhiều khả năng là một giao diện cụ thể (hoàn toàn có thể đối với một số lớp ứng dụng, như trò chơi DirectX). Có thể theo dõi một số nguyên nhân phổ biến đơn giản như thế này, nhưng tôi có xu hướng loại bỏ các ứng dụng làm hội thảo vô hiệu hóa khá nhanh, vì vậy ...
0000000C
là cách phổ biến hơn00000008
, nhưng không ai trong số các câu trả lời dường như đến địa chỉ đó ở tất cả: /