⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 garbagecollection.cpp

📁 Vc.Net入门与提高源码
💻 CPP
字号:
// This is the main project file for VC++ application project 
// generated using an Application Wizard.
//
// Written by Chris Maunder (chris@codeproject.com)
// The Code Project, http://www.codeproject.com


#include "stdafx.h"

#using <mscorlib.dll>

using namespace System;

__gc class MyGCClass
{
	int n;
};

__gc class CFinalizeTest : public Object, public IDisposable
{
public:
	CFinalizeTest()  
	{
		Console::WriteLine("In CFinalizeTest::CFinalizeTest()"); 
		m_bDisposed = false;
	}

	virtual ~CFinalizeTest() 
	{
		Console::WriteLine("In CFinalizeTest::~CFinalizeTest()"); 
	}

public:
	// You are encouraged to not allow a disposed object to be reused
	void MyMethod()
	{
       if (!m_bDisposed)
	   {
		   // do something
	   }
	   else
	   {
		   // throw an exception
	   }
	}

	// Cleanup code - either call Close directly, or 
public:
	void Close() 
	{
		Console::WriteLine("In CFinalizeTest::Close() - releasing resources"); 
		Dispose();
	}

	void Dispose()
	{
		if (!m_bDisposed)
		{
			m_bDisposed = true;
			Console::WriteLine("In CFinalizeTest::Dispose()"); 

			Console::WriteLine("Freeing resources..."); 

			GC::SuppressFinalize(this);  
		}
	}

protected:
	virtual void Finalize()
	{
		Console::WriteLine("In CFinalizeTest::Finalize()"); 
		Dispose();
		Object::Finalize();
	}

	bool m_bDisposed;
};

// This is the entry point for this application
#ifdef _UNICODE
int wmain(void)
#else
int main(void)
#endif
{
	Console::WriteLine("Garbage Collection demonstration\n");

	__int64 TotalMem = GC::GetTotalMemory(true);
	Console::WriteLine("Currently used {0} bytes of memory", TotalMem.ToString());

	// Wanton disregard for all the things we've been taught
	Console::WriteLine("Creating a ton of junk");
	for (int i = 0; i < 10000; i++)
		new MyGCClass();

	TotalMem = GC::GetTotalMemory(false);
	Console::WriteLine("Have now used {0} bytes of memory", TotalMem.ToString());

	GC::Collect();

	TotalMem = GC::GetTotalMemory(false);
	Console::WriteLine("After GC, used {0} bytes of memory", TotalMem.ToString());

	// -------------------------------------------------------------
	// Demonstration of Generations...

	Console::WriteLine("\nDemonstration of Generations\n");

	String* str = new String("This is a string");
	Console::WriteLine("We have created the string '{0}'", str);

	// How old is it?
	int nMaxGen = GC::MaxGeneration;
	int nGen = GC::GetGeneration(str);
	Console::WriteLine("The object's generation is '{0} (max {0})'", 
		nGen.ToString(), nMaxGen.ToString());

	// Let's make it older and wiser
	Console::WriteLine("Garbage Collecting...");
	GC::Collect();
	nGen = GC::GetGeneration(str);
	Console::WriteLine("The object's generation is '{0} (max {0})'", 
		nGen.ToString(), nMaxGen.ToString());

	Console::WriteLine("Garbage Collecting...");
	GC::Collect();
	nGen = GC::GetGeneration(str);
	Console::WriteLine("The object's generation is '{0} (max {0})'", 
		nGen.ToString(), nMaxGen.ToString());

	Console::WriteLine("Garbage Collecting...");
	GC::Collect();
	nGen = GC::GetGeneration(str);
	Console::WriteLine("The object's generation is '{0} (max {0})'", 
		nGen.ToString(), nMaxGen.ToString());

	// -------------------------------------------------------------
	// Demonstration of Weak References...

	Console::WriteLine("\nDemonstration of Weak References\n");

	Console::WriteLine("Creating a weak reference.");
	WeakReference* weak = new WeakReference(str);
	str = 0;

	if (weak->IsAlive)
	{
		str = (String*) weak->Target;
		Console::WriteLine("Object is alive. [{0}]", str);
		str = 0;
	}
	else
		Console::WriteLine("Object is gone");

	GC::Collect(0);

	if (weak->IsAlive)
	{
		str = (String*) weak->Target;
		Console::WriteLine("Object survived GC of generation 0. [{0}]", str);
		str = 0;
	}
	else
		Console::WriteLine("Object is gone (collected with Gen 0)");


	GC::Collect(1);

	if (weak->IsAlive)
	{
		str = (String*) weak->Target;
		Console::WriteLine("Object survived GC of generation 1. [{0}]", str);
		str = 0;
	}
	else
		Console::WriteLine("Object is gone (collected with Gen 1)");


	GC::Collect(2);

	if (weak->IsAlive)
	{
		str = (String*) weak->Target;
		Console::WriteLine("Object survived GC of generation 2. [{0}]", str);
		str = 0;
	}
	else
		Console::WriteLine("Object is gone (collected with Gen 2)");

	// -------------------------------------------------------------
	// Demonstration of Finalize/Dispose...

	Console::WriteLine("\nDemonstration of Finalize/Dispose\n");


	Console::WriteLine("Creating a CFinalizeTest object.");
	CFinalizeTest* ft = new CFinalizeTest();
	Console::WriteLine("Calling 'Close' then allowing the GC to collect it.");
	ft->Close(); // or ft.Dispose() if you want
	ft = 0;
	GC::Collect();

	Console::WriteLine("Creating a CFinalizeTest object, and will now delete it");
	ft = new CFinalizeTest();
	delete ft;
	ft = 0;


	Console::WriteLine("Creating a CFinalizeTest object, no Close or release to the GC.");
	ft = new CFinalizeTest();

	Console::WriteLine(" -- PROGRAM ENDS --\nPress Enter to continue");
	Console::ReadLine();

	return 0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -