В вопросе 1 вы смотрите на кучную память и стековую память.Короче говоря,
Mystruct S;
создает S в стеке.Когда S выходит из области видимости, он будет уничтожен.Следовательно, если S находится внутри функции, когда функция возвращается, S уничтожается.
Принимая во внимание, что
MyStruct *S = new MyStruct();
Находится в куче.Это блок памяти, отведенный программам для хранения переменных, и S будет хранить указатель на начальный блок памяти нового MyStruct.Это всегда будет в куче, пока вы не освободите его;если вы не освобождаете ее, когда ваша программа заканчивается, вы получаете гнусную утечку памяти.
По вопросу 2 - локальный MyStruct уничтожается при выходе из функции;указатель MyStruct, который указывает на его возвращаемое значение, указывает на неопределенную область.Это может все еще работать, потому что ОС еще не восстановила память, но это определенно неправильное поведение - или безопасная вещь.