Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C/C++包装器查找可能的内存泄漏 我有一个C程序,调用C++ DLL。函数的包装器代码如下所示_C#_C++_C++ Cli - Fatal编程技术网

C# 用C/C++包装器查找可能的内存泄漏 我有一个C程序,调用C++ DLL。函数的包装器代码如下所示

C# 用C/C++包装器查找可能的内存泄漏 我有一个C程序,调用C++ DLL。函数的包装器代码如下所示,c#,c++,c++-cli,C#,C++,C++ Cli,当这个函数被反复调用时,内存使用会继续增长,并且看起来好像内存泄漏了。这个问题似乎与下面代码中的matchingFragments->Add行有关。如果我把那行注释掉,内存使用是稳定的 在该程序以前的迭代中,matchingFragments不是一个列表,而是设置为固定数量的元素,在对该函数的多次调用中,内存使用将是稳定的。所以我怀疑某些内存没有被释放,但我不知道问题是什么,是matchedFragments,returnedFragments,还是两者都没有。我对这些也不太了解,我是一名C开发

当这个函数被反复调用时,内存使用会继续增长,并且看起来好像内存泄漏了。这个问题似乎与下面代码中的matchingFragments->Add行有关。如果我把那行注释掉,内存使用是稳定的

在该程序以前的迭代中,matchingFragments不是一个列表,而是设置为固定数量的元素,在对该函数的多次调用中,内存使用将是稳定的。所以我怀疑某些内存没有被释放,但我不知道问题是什么,是matchedFragments,returnedFragments,还是两者都没有。我对这些也不太了解,我是一名C开发人员,正在努力解决这个问题,因此,如果有任何建议,我将不胜感激

bool SearchWrapper::SpectrumSearch([Out] List<FragmentWrapper^>^% returnedFragments)
{
   vector<Fragment> matchedFragments;

   // perform the search
    bool isSuccess = _pSearchMgr->PeptideSearch(matchedFragments);

   // Convert data back to the managed world

   returnedFragments = gcnew List<FragmentWrapper^>();
   for (auto frag : matchedFragments)
   {
      returnedFragments->Add(gcnew FragmentWrapper(frag));
   }

   return isSuccess;
}

事实证明,我的问题的实际解决方案是需要一个FragmentWrapper类的终结器。有一个析构函数,但没有终结器。一旦我添加了终结器,内存泄漏就消失了。

如果你有一个C++ DLL,它可以使用动态内存分配。把它想象成一个C DLL。如果DLL具有分配内存的功能,那么它可能也有某种功能来释放该内存,因为C和C++不是垃圾收集语言。在C中,虽然您确实有垃圾收集,但它仅适用于.NET托管对象。当您调用分配内存的DLL时,您有责任在以后释放内存。因此,如果DLL不提供释放内存的方法。。。你真倒霉。克里斯,谢谢你的回复。我想我知道,在C++ DLL中分配的任何内存都需要释放。所以我应该对我寻求帮助的事情更具体一点。这里有几个后续问题可能会对我有所帮助。1在上面的代码示例中,在returnedFragments->addgcnewfragmentwrapperfrag;行中;,gcnew指令是否意味着返回的数据/内存将被垃圾收集?问题2:在这个SearchWrapper::SpectrumSearch函数的最前端,我如何清除returnedFragments当前持有的任何内存?由于该变量保存着返回给C的已分配内存,因此在后续调用中会将其传递回该函数,因此我应该能够释放它在该函数头部保存的任何内存,前提是内存不会自动被垃圾回收。我就是想不出这样做的正确语法。它必须是这个变量/内存,因为如果我注释掉那一行,我没有内存问题。再次感谢。