2009-07-28 29 views
22

Tôi muốn viết trình quản lý bộ nhớ của riêng mình. Ngôn ngữ đích là C++ và mục tiêu của trình quản lý bộ nhớ chủ yếu để giúp gỡ lỗi. Nó sẽ phát hiện giải phóng đôi, ghi đè bộ nhớ và vân vân. Và tất nhiên - tôi muốn tìm hiểu về quản lý bộ nhớ.Viết trình quản lý bộ nhớ của riêng bạn

Ai đó có thể cho tôi gợi ý để các tài nguyên mà tôi có thể học cách viết trình quản lý bộ nhớ như vậy không?

Cảm ơn sự giúp đỡ của bạn.

Trả lời

30

Tôi nghĩ rằng đây là một dự án rất thú vị mà bạn có thể học được rất nhiều từ. Đây là một ít tài liệu đọc về chủ đề quản lý bộ nhớ. Nó đi qua một số điều cơ bản về quản lý bộ nhớ, dẫn đến việc triển khai thực hiện malloc đơn giản, sau đó chạm vào một vài chủ đề nâng cao hơn.

Inside memory management

Ngoài ra, kể từ khi bạn đề cập rằng bạn muốn làm cho một người quản lý bộ nhớ đó là hữu ích để gỡ lỗi, bạn có thể muốn xem xét việc đọc bài viết này bởi các nhà phát triển của Memcheck/Valgrind (A debugger kỉ niệm tuyệt vời cho Linux). Nó chi tiết cách họ theo dõi tất cả các siêu dữ liệu (có hay không một byte cụ thể được xác định, intialized, vv) trong memchck.Đó là một chút chi tiết, nhưng nó là tốt đọc về cách làm cho một kiểm tra bộ nhớ năng động mở rộng và hiệu quả.

How to Shadow Every Byte of Memory Used by a Program

2

Tôi đã thấy một số mẫu sử dụng macro tiền xử lý C cho malloc. Đó là một ý tưởng thông minh. Tôi chắc chắn bạn có thể viết một cái gì đó như thế.

Đây có vẻ là điểm khởi đầu tốt.

http://stevehanov.ca/blog/index.php?id=10

-2

Nền tảng của bạn là gì? Chỉ cần suy nghĩ cho dù valgrind hoặc lint có thể giúp bạn trước khi bạn đi và cố gắng reimplement bồn rửa nhà bếp?

+2

chắc chắn - nhưng tôi sẽ không học bất cứ điều gì. –

+0

Bạn sẽ không học bất cứ điều gì về kỹ thuật mã hóa bằng cách sử dụng Valgrind để phát hiện rò rỉ của bạn? Chắc chắn nếu bạn đang sử dụng một cách thiếu sót của các đối tượng phá hủy (hoặc giải phóng tùy thuộc vào nền tảng của bạn) thì bạn sẽ tìm ra rất nhanh chóng. Tôi thấy giá trị trong việc triển khai heap, v.v. để xem nó được thực hiện như thế nào, nhưng toàn bộ nỗ lực của chính nó để làm điều đó đúng và nó khiến bạn có nhiều thứ hơn để gỡ lỗi khi bạn gặp sự cố. – Spence

+0

Nếu tôi làm điều đó cho công việc - bạn hoàn toàn đúng. Không có lý do gì để thực hiện lại bánh xe. Nhưng đối với những niềm vui và cho việc học tập, chỉ cần sử dụng valgrind không cung cấp cho cái nhìn sâu sắc và vui vẻ. Nhưng tôi đánh giá cao cách suy nghĩ của bạn Spence. Điều đầu tiên bạn nên làm nếu bạn bắt đầu lập trình là kiểm tra xem ai đó đã làm công việc của bạn chưa. Hầu hết thời gian họ làm tốt hơn thì bạn có thể làm. –

1

Có một trình quản lý bộ nhớ nguồn mở tuyệt vời được viết bằng Delphi: fastMM4. Nó có thể có giá trị để có một cái nhìn vào nó. Nó hỗ trợ nhiều tính năng bạn muốn triển khai và do đó có thể là một bản trình diễn tuyệt vời.

0

Bạn có thể thực hiện hầu hết mọi thứ trong điều khoản của malloc và miễn phí - trong thực tế, rất nhiều người quản lý bộ nhớ C++ được triển khai, ngay cả khi họ không phải như vậy.

Bạn có thể bắt đầu với triển khai đơn giản duy trì nhật ký của tất cả phân bổ và deallocations, nhưng chuyển tiếp phân bổ/deallocations thường xuyên đến malloc và miễn phí. Rõ ràng việc thực hiện đơn giản không nên sử dụng mới/xóa hoặc ...

Vì vậy, để bắt đầu, bạn có thể

  • đưa ra cấu trúc dữ liệu mà các bản ghi phân bổ và deallocations
  • Thực hiện nó chủ yếu là "C kiểu", mặc dù bạn có thể sử dụng vị trí mới để đảm bảo nhà xây dựng được gọi là
  • Thực hiện mới toàn cầu và xóa như giấy gói mà lần đầu tiên đăng nhập truy cập trong cấu trúc dữ liệu trên và sau đó chuyển tiếp cuộc gọi đến malloc hoặc miễn phí
1

Như @Spence đã nói, điều này đã được thực hiện nhiều lần. Nhưng vì lợi ích của việc học nó khá thú vị.

Tôi có thể đề nghị bạn hãy xem --wrap ld của Here vì nó rất hữu ích

+0

Đây là bước đầu tiên rất tốt trong việc chặn cuộc gọi mới() và xóa(). Xem bài đăng của Falaina về sự phức tạp của việc phát hiện các lỗi tràn ngập mảng - một con thú khác – Matt

0

Tôi nghĩ rằng bạn có thể bắt đầu với một thực hiện con trỏ thông minh trong đó sử dụng tính tham khảo cơ bản trong nền. Đây là những điều cơ bản về quản lý bộ nhớ và sẽ làm cho bàn chân của bạn bị ướt. Từ đó, bạn có thể sử dụng các triển khai của mình để tạo trình quản lý bộ nhớ nâng cao hơn.

0

"Hàng rào điện" là điểm khởi đầu cơ bản có thể hữu ích. Về cơ bản nó có triển khai tùy chỉnh của malloc và miễn phí cung cấp gỡ lỗi. Tuy nhiên, AFAIK, nó không tích hợp vào các toán tử mới/xóa của C++, mặc dù nó sẽ không quá lớn để tạo ra các triển khai mới/xóa toàn cầu tùy theo thói quen hàng rào điện.

4

Dave Hanson của C Interfaces and Implementations trình bày đầu tiên một người quản lý bộ nhớ tiêu chuẩn và sau đó một người quản lý bộ nhớ với một vài tính năng gỡ lỗi. Đây sẽ là một điểm khởi đầu tuyệt vời để học hỏi và mở rộng.

Tất nhiên, nếu bạn thực sự muốn chẩn đoán các vấn đề về bộ nhớ trong chương trình C hoặc C++ đang chạy, bạn nên sử dụng valgrind.