【发布时间】:2010-12-03 02:13:22
【问题描述】:
当我从我的 C# 代码调用非托管 C++ 代码时,我似乎有某种内存泄漏。
C++ 使用 ifstream.read 从文件中读取数据,并将其写入 Vector。
这仅在升级到 Windows 7 后发生,在 Vista 上不会发生,但如果我使用在 Vista 上编译的本机 dll 版本,它不会改变任何东西!
如果我直接运行相同的 C++ 代码,没有托管互操作,就不会发生内存泄漏!
如果我运行托管进程,但在 vshost 进程中,没有内存泄漏!
这是调用签名:
[DllImport(DllPath, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool MyMethod(
int x,
string y,
string z,
bool v,
bool w);
还有原生的:
MyDll_Export bool APIENTRY MyMethod(
int x,
const wchar_t* y,
const wchar_t* z,
bool v,
bool w)
当我从 C++ 中调用它时,我会这样称呼它:
MyMethod(1, L"My String 1", L"My String 2", true, true)
当我查看托管和非托管内存的性能计数器时,我发现所有内存都来自非托管代码。
考虑到编组非常简单,我不明白为什么直接调用 C++ 或通过 C# 调用有区别。
我也不知道为什么这只会发生在 Windows 7 上(两个 Windows 安装都有 .net 3.5 SP1)。
有人知道这是什么原因吗?
另外,如果有人知道适用于 Window 7 的本机内存分析工具,我会很高兴知道(现在我刚刚打印了所有显式内存分配的控制台,没有任何区别)。
【问题讨论】:
-
LeakDiag [mcfunley.com/277/… 或 AutomatedQA 的 AQTime 可以进行非托管泄漏分析。
-
您使用哪个性能计数器来测量内存消耗?
-
您已标记问题“vshost.exe”。测量内存消耗时,应用程序是否在 Visual Studio 下运行?
-
@Lou:在 Windows 7 上都不起作用。@Peter:我检查了“进程 - 私有字节”的本机分配和 CLR 内存的托管。我标记了 vshost.exe 是因为“如果我运行托管进程,但在 vshost 进程中,没有内存泄漏”,则常规进程的内存措施已关闭。
标签: c# c++ windows-7 memory-leaks vshost.exe