-842150451は2の補数として16進数にすると0xCDCDCDCDとなります。
これはVisual C++のデバッグモードでは「newなどで確保されたが、まだ初期化されていない領域」を表します。
実際、コードを見ると、Data::outputではnewで確保した配列のデータを明示的に初期化せずに出力していますね。
この配列の要素であるクラスMonsterのメンバはint型であり、コンストラクタやメンバの宣言に初期化はありません。
今回のnewでは、初期化用のデータが指定されていないので、確保された領域はdefault-initializeされます。
(N3337 5.3.4 Newの15)
「Monsterの配列」のdefault-initializeは、それぞれの要素Monsterのdefault-initializeです。
Monsterはクラスなので、default-initializeではデフォルトコンストラクタが呼び出されます。
(N3337 8.5 Initializersの6)
デフォルトコンストラクタとは、引数を与えずに呼び出せるコンストラクタのことです。
(N3337 12.2 Constructorsの5)
Monsterクラスのデフォルトコンストラクタは、
同じクラスの他のコンストラクタを利用しない (non-delegating constructor) です。
また、Monsterクラスの各メンバは以下の条件を満たします。
・各mem-initializer-list (コンストラクタの引数の後に : 変数名(値)をつけるやつ) に無い
・抽象クラスの仮想基底クラスではない
・brace-or-equal-initializerを持たない (メンバの宣言に直接初期化が書かれていない)
・unionではない
従って、各メンバはdefault-initializeされます。
(N3337 12.6.2 Initializing bases and membersの8)
各メンバはintであり、クラスでも配列でもないので、初期化は行われません。
(N3337 8.5 Initializersの6)
従って、初期化用のデータを指定しないnewによって、Monsterクラスのメンバは初期化されません。
そのため、コンパイラによって埋められた-842150451がそのまま出力されたと考えられます。
改善するには、以下のようにするといいでしょう。
・Data::input 関数内の delete[] monst; を削除する (入力されたデータをそのまま保持しておく)
・Data::output 関数内の Monster* monst = new Monster[num]; を削除する
(新たに確保した領域ではなく、入力されたデータがある領域を使用する)
さらに、これだけだとData::outputを複数回連続して呼び出すと開放された領域を使用することになって危険なので、
Data::output 関数内の delete[] monst; も削除しておいたほうが安全でしょう。
参考:
Working Draft, Standard for Programming Language C++ (N3337)
Decimal to Hexadecimal Converter
c++ - When and why will a compiler initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete? - Stack Overflow
What is a non-delegating constructor in c++ - Stack Overflow