Штука первая, делать надо не так:
array = (Type*) malloc(100);
а так:
array = new Type[ 100 ];
или, лучше, вот так:
array = static_cast<Type*>( new uint8_t[ 100 * sizeof( Type ) ] );
Штука вторая. У тебя в выделенном блоке памяти мусор лежит. Надо сперва память подготовить. Делаем вот так:
memset( array, 0, 100 * sizeof( Type ) );
Это приведет к очистке памяти. Но и после этого память все еще нельзя использовать.
Следом надо переделать вот так:
void push_back(Type elem) {
new( array ) Type();
array[0] = elem;
}
или так:
void push_back(Type elem) {
new( array ) Type( elem );
}