finalizer test




cat finalizer_test.cpp
#using <mscorlib.dll>
#using <System.dll>
using namespace System;

ref class Test {
public:
	String^ msg;
    // construcor
    Test(String^ msg) {
		this->msg = msg;
        Console::WriteLine(this->msg+" Constructed");
    }
    // destructor (Dispose method)
    ~Test() {
        Console::WriteLine(this->msg+" Destructed");
    }
    // finalizer
    !Test() {
        Console::WriteLine(this->msg+" Finalized");
    }
};

void useDispose() {
    Test test("test1 (Test test)");
    Console::WriteLine("in useDispose");
}

void useGCNew() {
    Test ^ test = gcnew Test("test2 (Test^ test)");
    Console::WriteLine("in useGCNew");
}
void useGCNew2() {
    Test ^ test = gcnew Test("test3 (Test^ test ... then delete");
    Console::WriteLine("in useGCNew2");
	delete test;
}

int main(array<System::String ^> ^args) {
    Console::WriteLine("in main");
    useDispose();
    Console::WriteLine("in main");
    useGCNew();
    Console::WriteLine("in main");
    useGCNew2();
    Console::WriteLine("in main");
    return 0;
}

cat makefile
TARGET=finalizer_test

all: $(TARGET).exe

.PHONY: all test mmm clean
.SUFFIXES: .obj
LOPT=

OBJS=$(TARGET).obj 

$(TARGET).obj: $(TARGET).cpp 

$(TARGET).exe: $(OBJS) 
	link $(LOPT) $(OBJS) 

.cpp.obj:
	cl -c -Wall -Od -clr $<

test: $(TARGET).exe
	./$(TARGET).exe 

clean:
	-rm $(TARGET).exe *.obj *~ $(TARGET).manifest

mmm: 
	cat $(TARGET).cpp
	@echo 
	cat makefile
	
html:
	cat /dev/clipboard | code2html.exe | unix2dos 



./finalizer_test.exe 
in main
test1 (Test test) Constructed
in useDispose
test1 (Test test) Destructed
in main
test2 (Test^ test) Constructed
in useGCNew
in main
test3 (Test^ test ... then delete Constructed
in useGCNew2
test3 (Test^ test ... then delete Destructed
in main
test2 (Test^ test) Finalized