Khi tôi gọi một mã C++ không được quản lý từ mã C# của tôi, tôi dường như có một số loại rò rỉ bộ nhớ.
C++ đọc dữ liệu từ một tệp bằng cách sử dụng ifstream.read và ghi nó vào Vector.rò rỉ bộ nhớ khi gọi mã không được quản lý từ mã được quản lý trong Windows 7
Điều này xảy ra chỉ sau khi nâng cấp lên Windows 7, không xảy ra trên Vista, nhưng nếu tôi sử dụng phiên bản dll gốc được biên dịch trên Vista, nó không thay đổi gì cả!
Nếu tôi chạy cùng một mã C++ trực tiếp, không có tương tác được quản lý, không có rò rỉ bộ nhớ!
Nếu tôi chạy quy trình được quản lý, nhưng trong quá trình vshost, không có rò rỉ bộ nhớ!
Dưới đây là chữ ký cuộc gọi:
[DllImport(DllPath, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool MyMethod(
int x,
string y,
string z,
bool v,
bool w);
và mẹ đẻ một:
MyDll_Export bool APIENTRY MyMethod(
int x,
const wchar_t* y,
const wchar_t* z,
bool v,
bool w)
Khi tôi gọi nó từ C++, tôi gọi nó là như thế này:
MyMethod(1, L"My String 1", L"My String 2", true, true)
Khi tôi nhìn vào các bộ đếm hiệu suất cho bộ nhớ được quản lý và không được quản lý, tôi thấy rằng tất cả bộ nhớ đến từ mã không được quản lý.
Xét rằng marshaling khá đơn giản, tôi không hiểu tại sao có sự khác biệt giữa việc gọi C++ trực tiếp hoặc thông qua C#.
Tôi cũng không biết tại sao điều này chỉ xảy ra trên Windows 7 (cả hai bản cài đặt Windows đều có .net 3.5 SP1).
Có ai có ý tưởng lý do cho việc này không?
Ngoài ra nếu có ai biết về công cụ định dạng bộ nhớ gốc hoạt động trên Cửa sổ 7, tôi rất vui được biết (hiện tại tôi đã in để bàn giao tất cả cấp phát bộ nhớ rõ ràng và không có sự khác biệt).
LeakDiag [http://mcfunley.com/277/using-leakdiag-to-debug-unmanaged-memory-leaks] hoặc AQTime của AutomatedQA có thể thực hiện phân tích rò rỉ không được quản lý. –
Bạn sử dụng bộ đếm hiệu năng nào để đo mức tiêu thụ bộ nhớ? –
Bạn đã gắn thẻ câu hỏi "vshost.exe". Ứng dụng có chạy dưới Visual Studio khi bạn đo mức tiêu thụ bộ nhớ không? –