未初期化な領域とアラインメント

(注意:あくまで C++ の言語規格 ISO 14882-2003 のみを想定します)
未初期化なメモリ領域を char 配列の自動変数として(スタック上に)確保し,その領域上に別の型のオブジェクトを構築するコードを考えてみる.

class MyClass
{
  .....
};

int main()
{
  char buf[sizeof(MyClass)];
  MyClass *p = static_cast<MyClass *>(static_cast<void *>(buf));
  ::new (p) MyClass();

  .....

  p->~MyClass();
}

あるいは,フリーストア(ヒープ)上に未初期化なメモリ領域を char の配列として確保し,その領域上に別の型のオブジェクトを構築するコードを考えてみる.

class MyClass
{
  .....
};

int main()
{
  MyClass *p = static_cast<void *>(::new char[sizeof(MyClass)]);
  ::new (p) MyClass();

  .....

  p->~MyClass();
  delete[] p;
}

上記2つのコード各々について,問題があればそれらを指摘せよ.また問題がある場合,それらを回避する方法が存在するか?