当我从C#代码调用非托管的C++代码时,似乎存在某种内存泄漏问题。C++使用ifstream.read从文件中读取数据,并将其写入Vector中。
这只在升级到Windows 7后发生,而在Vista上没有发生,但如果我使用在Vista上编译的本地dll版本,也不会改变任何东西!如果我直接运行相同的C++代码,而不是通过托管互操作性,就没有内存泄漏问题!如果我在vshost进程中运行托管进程,则没有内存泄漏问题!
以下是调用签名:
当我从C++中调用它时,我会这样调用:
当我查看托管和非托管内存的性能计数器时,我发现所有内存都来自非托管代码。考虑到封送是非常简单的,我不明白为什么直接调用 C++ 和通过 C# 调用之间会有差异。我也不知道为什么这只会在 Windows 7 上发生(两个 Windows 安装都安装了 .net 3.5 SP1)。
有人知道原因吗?
另外,如果有人知道一个适用于 Window 7 的本机内存分析工具,我会很高兴知道(目前我只是将所有显式内存分配打印到控制台,没有任何区别)。
这只在升级到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 的本机内存分析工具,我会很高兴知道(目前我只是将所有显式内存分配打印到控制台,没有任何区别)。