2011-03-09 28 views
6

Tôi có một thư viện mã c lớn dùng để ghi kết quả vào tập tin. Tôi chuyển đổi nó để trả lại dữ liệu của nó thông qua một mảng float * để một chương trình C++ như ví dụ (để tránh tập tin liên tục I/O):Bộ nhớ mã c không được quản lý miễn phí trong C#

float* mgrib(...) 

này làm việc tốt trong C++ nơi tôi có thể "miễn phí" bộ nhớ. Tôi đã quản lý để đưa dữ liệu vào C# đúng cách qua:

IntPtr pointer = mgrib(...); 
float[] result = new float[ size ]; 
Marshal.Copy(pointer, result, 0, size); 
Marshal.FreeCoTaskMem(pointer); 

Đây là vòng lặp trong nhiều trường phải được lấy từ hàm. Nếu nó nhỏ hơn 256 trường thì nó hoạt động rất tốt. Nếu nó nhiều hơn nó bị treo mà không có cảnh báo. Nếu tôi chạy một tập tin thông qua nó đúng cách sau đó chạy một tập tin khác (tổng cộng hơn 256) nó bị treo. Tôi xa một chuyên gia CS nhưng 256 có vẻ giống như một sự trùng hợp ngẫu nhiên.

Tôi đánh giá cao mọi thông tin chi tiết. Cảm ơn.

Trả lời

6

Trước hết, bạn có chắc chắn thư viện C++ phân bổ bộ đệm giá trị trả về bằng cách sử dụng CoTaskMemAlloc, để bạn có thể giải phóng nó bằng cách sử dụng Marshall.FreeCoTaskMem? Có various memory (de)allocation functions và bạn không thể tự do trộn chúng.

Đó là lý do tại sao các thư viện thường được thiết kế để phân bổ và giải quyết bộ nhớ “trên một mặt”, ví dụ: sử dụng một cái gì đó như

void mgrib(..., float *buff, int buffsize); 
+0

Thư viện thực sự là mã c. Nó được phân bổ với malloc (Tôi có thể phân bổ với CoTaskMemAlloc trong c?). Từ những gì tôi đọc FreeCoTaskMem trực tuyến tương thích với malloc, nhưng tôi đã vượt qua đầu của tôi về các chủ đề như thế này. Cảm ơn vì sự trả lời. – Anthony

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