2015-06-08 17 views
10

Giả sử rằng EXE và DLL sử dụng cùng một trình biên dịch và phiên bản STL. Nếu tôi sử dụng số std :: vector trong EXE của mình và sử dụng đặt trước để đặt trước bộ nhớ. Sau đó, tôi vượt qua nó như là tham chiếu đến một DLL.C++ sử dụng std :: vector qua các ranh giới

Tôi thực hiện push_back trong DLL để thêm phần tử vào vectơ của tôi. Nếu tôi không vượt quá dung lượng thực tế, là bộ nhớ của phần tử mới được phân bổ trong DLL hoặc trong EXE?

+0

Liên quan: https://msdn.microsoft.com/en-us/library/ms235460(v=vs.110).aspx –

Trả lời

0

Không.

Nó bố trí trong không gian bộ nhớ ảo của quá trình, có mã là một sự kết hợp của .exe.dll.

+5

Uhm, no. Một DLL sử dụng - nói chung - một bộ cấp phát bộ nhớ khác, và bạn không nên truyền tài nguyên qua một ranh giới DLL. Xem [Tội lỗi tiềm năng truyền các đối tượng CRT qua ranh giới DLL] (https://msdn.microsoft.com/en-us/library/ms235460.aspx) để tham khảo. – IInspectable

+0

Nếu cả EXE và DLL đều được xây dựng với cùng trình biên dịch và cài đặt VC++ và liên kết động với cùng một hương vị CRT (mà tôi biết là rất hạn chế), thì tôi tin rằng câu trả lời của Lightness là chính xác. Nếu bạn xây dựng một thử nghiệm EXE và DLL và gọi '_get_heap_handle()' từ mỗi một, bạn sẽ nhận được _same_ trả về xử lý (ít nhất, đây là những gì tôi có trong các bài kiểm tra của tôi). Tôi đã viết rằng trong một câu trả lời, nhưng tiếc là câu hỏi là (IMO không chính xác) đóng cửa, vì vậy tôi đang viết một bình luận ở đây. –

+2

@ Mr.C64: Ngay cả dưới những ràng buộc bạn đặt tên, câu trả lời này vẫn sai: Bộ nhớ không bao giờ được cấp phát trong không gian địa chỉ ảo. Nó được cấp phát trong một heap, bộ nhớ của nó được ánh xạ vào không gian địa chỉ đã nói. Heap được sở hữu bởi các module tương ứng. Sự phân biệt này, trong khi quan trọng, là mất tích từ câu trả lời hoàn toàn. – IInspectable

3

This is generally a bad idea.

Khi bạn gọi push_back, một bản sao có thể được làm từ bất cứ đối tượng bạn đang thêm vào vector. Không có gì đảm bảo rằng kích thước của đối tượng đó (trong số những thứ khác) giống với kích thước được đặt trong .exe qua std::vector::reserve. Cả hai tệp nhị phân có thể đã được biên dịch bằng một phiên bản khác của STL.

+0

Ok Tôi hiểu, nhưng giả sử rằng dung lượng vectơ đủ lớn và tất cả các hạn chế về nhị phân (bộ biên dịch, thư viện, cài đặt ngoại lệ, ...) đều được đáp ứng. Có ok không để làm điều đó (theo một điểm bộ nhớ của xem)? Nói cách khác, nếu DLL được phát hành sau đó, dữ liệu vẫn tồn tại và có thể truy cập được không? – FSeywert

+1

Giả sử mọi thứ sắp xếp hoàn hảo, chắc chắn. Tuy nhiên nó vẫn là một ý tưởng tồi để vượt qua mọi thứ trên ranh giới DLL. Bạn nên tìm một giải pháp khác để chia sẻ thông tin bạn cần. (ví dụ, phân bổ vectơ trong DLL và trả về một tham chiếu đến EXE). – lcs

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