当前位置: 首页 > 知识库问答 >
问题:

在C#单例模式下内存不会释放

华萧迟
2023-03-14

我对C#中的单例模式在C++中释放对象内存有一个困惑;这里是C++代码:

#include<iostream>
using namespace std;
class Rocket
{
private:
    Rocket() { speed = 100; }
    ~Rocket() {}
    static Rocket* ms_rocket;
public:
    int speed;
    static Rocket*ShareRocket()
    {
        if (ms_rocket == NULL)
            ms_rocket = new Rocket();
        return ms_rocket;
    }
    static void Close()
    {
        if (ms_rocket != NULL)
            delete ms_rocket;
    }
};
Rocket *Rocket::ms_rocket = NULL;
int main()
{
    Rocket* p =  Rocket::ShareRocket();
    p->speed = 100;
    cout << p->speed << endl;
    Rocket::Close();
    cout << p->speed << endl;
    getchar();
}

当我使用rocket::close()时,ms_rocket指向的内存空间将被释放,ms_rocket变成一个野指针,第二个“cout

    class A : IDisposable
    {
        public int age;
        public A() {  }
        public void Run()
        {
            Console.WriteLine("Run");
        }
        #region IDisposable Support
        private bool disposedValue = false; 

        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    Console.WriteLine("A is release");
                }
                disposedValue = true;

            }
        }
        public void Dispose()
        {
            Dispose(true);
        }
        #endregion
    }

    class B
    {
        static A a;
        private B() { }
        public static A Intance
        {
            get
            {
                if (a == null)
                    a = new A();
                return a;
            }
        }

    }
    class Class1
    {

        public static void Main(string[] args)
        {
            A a = B.Intance;
            a.age =100;
            Console.WriteLine(a.age);
            a.Dispose();
            A a1 = B.Intance;
            Console.WriteLine(a1.age);
            Console.Read();
        }
    }

在C#中,我认为当我使用Dispose()时,内存(B单例中的'a'对象)会被释放,但在第二次访问中,age值不应该是100,静态变量'a'会变得像野指针一样。谁能告诉我为什么?

共有1个答案

祝高超
2023-03-14

Dispose主要用于在不需要的时候释放非托管资源,而不是释放对象本身占用的内存--它由垃圾收集器处理,垃圾收集器只会在它从所谓的GC根(而静态变量是GC根之一,因此B.intance将在堆中保留对A实例的引用)变得不可访问时才释放(当GC决定它需要运行时)。

 类似资料:
  • 单例模式的定义 确保某一个类只有一个实例, 而且自行实例化并向整个系统提供这个实例。 方法一: static Singleton *getInstance() { static Singleton locla_s; return &locla_s; } 该代码可能在c++11之前的版本导致多次构造函数的调用,所以只能在较新的编译器上使用。 方法二:

  • 我在C#上度过了一段糟糕的时光,在我不再引用它之后,没有为我保存在内存中的大型结构释放内存。 我在下面包含了一些代码,它们显示了与我遇到的问题类似的问题。我想我一定是误解了GC,因为我不确定为什么下面的代码会抛出内存不足异常。 有人知道为什么我包含的代码会丢失内存吗?没有一份名单被保留,可以立即清理。 谢谢, 保罗 复制:全新的4.5控制台应用程序,将代码粘贴到Main中。 异常将在for循环的第

  • 本文向大家介绍c# 单例模式的实现,包括了c# 单例模式的实现的使用技巧和注意事项,需要的朋友参考一下   记一下学习单例模式的笔记:   单例就是要保证该类仅有一个实例。实现完全封闭的单例(外部不能new)其实就要两点要求: 全局访问:需要一个该类型的全局静态变量,每次获取实例时都要判断它是否null,不存在new,存在通过一个方法直接返回该值获取实例来保证对象唯一; 实例化控制:new实例不能

  • 本文向大家介绍C#设计模式之单例模式实例讲解,包括了C#设计模式之单例模式实例讲解的使用技巧和注意事项,需要的朋友参考一下 前言 最近开始花点心思研究下设计模式,主要还是让自己写的代码可重用性高、保证代码可靠性。所谓设计模式,我找了下定义:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工

  • 本文向大家介绍解析C#设计模式之单例模式,包括了解析C#设计模式之单例模式的使用技巧和注意事项,需要的朋友参考一下   单例模式(Singleton),故名思议就是说在整个应用程序中,某一对象的实例只应该存在一个。比如,一个类加载数据库中的数据到内存中以提供只读数据,这就很适合使用单例模式,因为没有必要在内存中加载多份相同的数据,另外,有些情况下不允许内存中存在多分份相同的数据,比如数据过大,内存

  • 我有应用程序以守护程序模式运行。 我有一个视图,它从数据库中获取重要的queryset,并通过计算queryset的结果另外分配数组,然后返回这个数组。我没有使用线程本地存储、全局变量或任何类似的东西。 问题是,我的应用程序占用的内存与我为mod_wsgi设置的线程数相对应。 我做了一个小实验,在mod_wsgi中设置了不同数量的线程,然后通过curl检查wsgi进程的内存可以爬升多远来点击我的视