MyClass* t1;
This doesn't actually allocate the memory for a MyClass object. Your variable is only a pointer with the potential to track the memory address of MyClass objects, but no such object is being created yet, and the pointer isn't being set to point anywhere.
(Of course, some memory is allocated for the pointer itself, but that's on the stack if this statement is inside a function, or global otherwise.)
t1 = (MyClass*)new MyClass;
This is the right kind of thinking for creating a MyClass instance. Still, the best way is usually to do it on the stack:
MyClass t; // who needs a pointer?
Then you don't have to even think about the memory. The disadvantage is that the object only exists until you leave the scope it was created in, as indicated by the nesting of { and }.
If you want the object to live longer then you really do need it on the heap (or can make it a static / global variable). For dynamic allocation on the heap just use:
t1 = new MyClass;
You don't need - or want - to explicitly cast the returned pointer to MyClass*... it's just redundant and a potential source of bugs if you change the class name in one place but not another.
Some time later, you'll want to delete t1 too.
The actual size of MyClass may not be 9 bytes.. it depends on the compiler, and may be a function of compiler command line flags, compiler version, target memory model, OS etc..