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