2011-01-10 25 views
5

Tôi biết rằng nếu các liên kết DLL tĩnh của bạn chống lại một phiên bản khác của thời gian chạy thì nó sẽ tạo ra một đống riêng của nó. Nó cũng sẽ nếu nó được hướng dẫn để tạo ra một đống. Trong những trường hợp này, nó là không an toàn cho các DLL để xóa những gì exe được phân bổ. Trong những trường hợp nào điều này không áp dụng (như trong, nó là an toàn cho các DLL để xóa những gì exe được phân bổ)? Có an toàn nếu cả exe và liên kết DLL tĩnh đối với cùng một thư viện thời gian chạy?Khi nào một DLL chính xác sẽ sử dụng một đống khác so với tệp thực thi?

Cảm ơn

về cơ bản là có một cách mà bất cứ ai phân bổ nó chỉ có thể làm addEvent(new DerivedEvent(), FunctorDestroyClass());

+0

No. Đây là lý do tại sao bạn liên kết động với thời gian chạy. Đây là hành vi tiêu chuẩn (liên kết động) và cách duy nhất được MS đề xuất. tĩnh liên kết thời gian chạy chỉ gây ra nhức đầu. Chỉ cần không làm điều đó. –

Trả lời

2

tôi có thể đọc thêm vào câu hỏi của bạn hơn là có, nhưng nếu bạn đang muốn biết làm thế nào bạn có thể phân bổ và giải phóng bộ nhớ qua các biên giới DLL, sau đó bạn có thể sử dụng giống như sau:

#define DLLMemAlloc(size) HeapAlloc(GetProcessHeap(), 0, size) 
#define DLLMemFree(mem) HeapFree(GetProcessHeap(), 0, mem) 

Điều đó có thể an toàn hơn (một phần nỗ lực trong tương lai). Dựa vào các tùy chọn xây dựng khác nhau để đảm bảo sự an toàn của việc phân bổ và giải phóng trên các ranh giới có thể dẫn đến các vấn đề.

Và (cũng không phải là một phần của câu hỏi), bạn có thể nghĩ lại liệu việc đó có thực sự cần thiết để có thể thực hiện điều này hay không. Nó có vẻ như có thể có một lỗ hổng thiết kế nếu một DLL phải phân bổ một cái gì đó mà một DLL (hoặc thực thi) đã miễn phí.

+0

Đó là bởi vì tôi muốn thực hiện các sự kiện đa hình, vì vậy không có cách nào để làm điều này, và nếu người dùng không có cách nào để theo dõi thời gian họ sẽ không biết khi nào giải phóng nó. – jmasterx

+1

Tôi đồng ý. Tôi không nghĩ rằng bạn có thể phân bổ ở một bên và miễn phí trên khác và ngủ ngon vào ban đêm, ngay cả khi nó hoạt động tốt tại thời điểm nó sẽ cắn bạn trong ass một ngày. –

+0

@Milo DLL có thể phơi bày một giao diện dọn dẹp và EXE có thể sử dụng nó miễn phí thay vì chỉ sử dụng một cuộc gọi miễn phí(). –

0

DLL sẽ nhận được nó là quản lý bộ nhớ riêng nếu bạn liên kết thư viện thời gian chạy tĩnh. Bạn có 3 tùy chọn: liên kết thời gian chạy động, luôn phân bổ và deallocate trong cùng một vị trí (DLL hoặc thực thi, cung cấp chuyển tiếp nếu cần), hoặc sử dụng bộ cấp phát bộ nhớ bên thứ 3 mà sẽ chăm sóc vấn đề này.

+0

Vì vậy, nếu DLL liên kết đến thời gian chạy của MSVCR80.DLL động, sau đó exe liên kết đến MSVCRT90.DLL động, không có vấn đề gì? – jmasterx

+0

Chắc chắn là nếu chúng không có cùng phiên bản. Bạn không nên dựa vào hai mô-đun để có cùng một đống. – Puppy

+1

@Milo không có vấn đề gì trừ khi bạn cố gắng phân bổ ở một bên và miễn phí ở bên kia, nhưng tôi chưa thử bản thân mình (tm). –

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