MyClass* t1;
Это фактически не выделяет память для объекта MyClass.Ваша переменная - это только указатель с возможностью отслеживания адреса памяти объектов MyClass, но такой объект еще не создается, и указатель нигде не указывается.
(Конечно, некоторыепамять выделяется для самого указателя, но он находится в стеке, если этот оператор находится внутри функции, или глобальный в противном случае.)
t1 = (MyClass*)new MyClass;
Это правильное мышление для создания экземпляра MyClass.Тем не менее, обычно лучше всего делать это в стеке:
MyClass t; // who needs a pointer?
Тогда вам даже не нужно думать о памяти.Недостатком является то, что объект существует только до тех пор, пока вы не покинете область, в которой он был создан, как указано вложением {и}.
Если вы хотите, чтобы объект жил дольше, тогда он действительно вам нужен накуча (или может сделать это статической / глобальной переменной).Для динамического размещения в куче просто используйте:
t1 = new MyClass;
Вам не нужно - или вы не хотите - явно приводить возвращенный указатель к MyClass * ... это просто избыточно и потенциальный источник ошибок, если выизмените имя класса в одном месте, но не в другом.
Через некоторое время вы тоже захотите удалить t1.
Фактический размер MyClass не может быть 9 байтов .. это зависитна компиляторе и может быть функцией флагов командной строки компилятора, версии компилятора, целевой модели памяти, ОС и т. д.