C#无法占用新内存

本文关键字:内存 新内存 | 更新日期: 2023-09-27 18:09:52


我正在做一个c#-c++(管理(混合项目,我们意识到我们的项目中存在内存泄漏,所以我搜索发现,c++部分的析构函数从未调用过,所以我写了一段代码来释放内存。现在,我可以看到程序在内存中增长较慢(内存泄漏更多(,但问题是,在c部分,程序由于"out of memory exception"而开始崩溃。在等操作中

double []k = new double[65536];

程序的内存使用量通常看起来是400-500mb,但它崩溃了
OS:win服务器2003
内存:4 GB
操作系统应该让程序增长近1200 mb,但在我写下空闲内存部分后,它开始崩溃400-500 mb
我从c#部分调用了这个c++函数来释放内存

freeMemories()
{
   if(!mIsAlreadyFreedMemory)
   {
      mIsalreadyFreedMemory = true;
      _aligned_free(pointerA);
      _aligned_free(pointerB);
       ....
    }
}

为什么它不能获取新内存,程序不能再次获取释放的内存?

C#无法占用新内存

您应该对对象使用IDisposable模式。基本思想是:

public class MyObject : IDisposable
{
    // Some unmanaged resource:
    UnmanagedResource unmanaged;
    // Finalizer:
    ~MyObject
    {
        DisposeUnmanaged();
    }
    public void Dispose()
    {
        DisposeManaged();
        DisposeUnmanaged();
        GC.SuppressFinalize(this);
    }
    protected virtual DisposeManaged()
    {
        // Dispose _managed_ resources here.
    }
    protected virtual DisposeUnmanaged()
    {
        // Dispose _unmanaged_ resources here.
        this.unmanaged.FreeMe();
        this.unmanaged = null;
    }
}

然后,一旦确定不再需要对象,就可以对其调用Dispose,并且非托管内存将被释放。

MyObject obj;
obj.Dispose();

或者,如果忘记调用Dispose,则当垃圾收集器(通过终结器(收集对象时,非托管资源将被释放。

我找到了解决问题的方法。问题的原因是内存碎片。在我的项目中,在项目的c++部分有很多大的(0.5 mb*(15-20分配((对齐的内存分配,所以在分配和释放内存之后,连续地。有足够的内存用于将来的操作,但它被拆分为小部分。为了防止这种情况,我使用了内存池模式。而不是大量分配。我分配了一个大池,并将其用于所有带有指针的数组。所以在c部分操作中,如
double[]k=新的double[65536]
操作现在不会造成问题。