スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

newキーワードとnew演算子

あんこおおおぉぉ!
いい娘だったのに…。


見返したらタイトルが文字化けしていることを発見。墨灼◆鏡か…。
西さんが好きそうだな。元からタイトルなんか意味あること書いてないからどうでもいいや。

さらにずいぶん前から微妙にコメントが付いていたことを今更確認。
そして若干真面目にC++のこととか書くと、全く反応がないことも確認。なんだよ。
>スカイプに音声じゃないがUPっといた。
見に行ったが何もなかった。っていうかそもそも最近の会話がなかった。

そしてめっきり格ゲーの腕は上達しない。無理だろ指の動き的な意味で。
でもアマ公がかわいいから許す。フェリシアはウザいから帰れ。
使いやすさでいうとスーパースクラルが個人的に使いやすい。技も出しやすいし。
ただし欠点は、なんか知らないけどデザインが噛ませキャラを彷彿させる。なんでだろ…。
噂によると相変わらず前作から続いてセンチネル祭りらしいがそれは少しでも格ゲーが
「できる」判定の人だけだろうと思う。初心者があいつで出征するとあたり判定でかいからウワアアアア。


さて、Nの字も関係なくなってきたNISHIGE、塾のせいでさっぱり進まないがWave解析クラスは作成できた。
基本的なC++のファイルストリームでの実装だからなんとなくWindows依存ではなくなるだろう。
さてこっからはストリーミングスレッドとかの、スレッドを管理するクラスを作るべきか。
めんどくさいし今のと頃はbeginthreadexだか何かで直接作っちゃえばいいかな。
ただ今ひとつ子スレッドが終わるまでどういう風にどこ待つべきかよくわからない。
どっちにせよXAudio2の本体を管理するクラスと、効果音とかストリーミングしない音声、
BGM等ストリーミングしたい音声を再生するためのプレーヤークラスの3つの実装かな目標は。

で、それができたら前に作ったDirectInput用のクラスを改善すると。
そしたら描画・入力・音声がそろうのであとは本編を作ると。

まずは全体を管理する構成を考えて、システムを考える。シーンの移り変わりとか。
なるべく敵を作成したり自機を作成したりする動作を一元化して、使いやすくする。
そしてそれを管理できるようなリストを作る。…これはSTLのリストでもいいか。

ま、たぶん時間的に終わらないんですけどね。この休みじゃ。さてここから本題。オブジェクトを構成する先のメモリを指定(したり)するnew、
いわゆる配置newを調べて分かった、そもそもnewとはなんなのかの覚え書き。

まず、結論としてnewとoperator new、そしてdeleteとoperator deleteは、完全に別物だと言うこと。
いやー初めて知ったよ。なるほどとは思うが。だって巷の本に書いてないじゃない。
普通にメモリ確保に使ういわゆるnew・deleteは、newやnew演算子、new式などと呼ばれ、
オーバーロードできるnewもあまり区別されず、newやnew演算子、new演算子関数とか呼ばれてるっぽい。


今回は区別のため、前者をただのnew、後者をnew演算子と呼ぼう。
deleteも同じ感じで。以下間違えないように。


で、newとdeleteにはそれぞれ次の役目がある。(これらは、式として呼びだされたもののこと)

new
・オブジェクトを構成するメモリのポインタを返す
・コンストラクタの呼び出し
delete
・デストラクタの呼び出し
・指定ポインタのメモリの解放

見て分かるように、どちらも二段構えで処理が行われる(らしい。
さてここで、コンストラクタ・デストラクタの呼び出しを、
new・delete演算子オーバーロードではしていない事実がある。
つまりnew・delete演算子はメモリの確保と解放処理のみをすげ替えているわけ。
これらをオーバーロードすると、ただのnewに引数を指定できて、
それらを使って独自に作る場所を返すように変えてもいいよってことらしい。
new演算子はどこに作るか、という情報を最低限返せばいいため、
必ずしもヒープからメモリ確保を行う必要性は無いみたい。
だからこそplacement newが可能らしい。デフォルトはmalloc()辺りで確保してるみたい。


そうすると、必然deleteとdelete演算子はどうなのってことになる。
これはnewとは事情が異なってくる。なぜなら、delete演算子をオーバーロードしても、
それらの引数をdeleteに渡せる構文がC++言語に無いから。
じゃあどこで呼ばれんのってことだが、これはオーバーロードしたnew演算子で
オブジェクト確保をしてかつ、その後のコンストラクタで例外が投げられたとき、
というめちゃくちゃ限定的な状態らしい。今のところ出会ったことないよ。それじゃどうやってdeleteするのか、ってことなんだが、placement newに関しては、
もとより確保してるメモリに配置しているので、呼ぶ必要はない。
ただ、オブジェクト内でさらにメモリ確保してた時なんかはデストラクタ呼びたいので、
直接デストラクタを呼ぶってのが解決法のひとつみたいである。
もしくは、そのオブジェクトの動的確保がplacement newでしか行われないとするなら、
空実装のdelete演算子を定義してやることで、実質メモリ解放処理をせず、
デストラクタを呼び出すだけの処理になるみたい。
ここで適当なこと書いてやれば自分で確保してるメモリを返してもらえそうですな。

ということを頭に入れて残りの休みC++を弄りませうか。


スポンサーサイト

Comment

No:218|No title
西さんがうpしたやつは分岐の選択肢と分岐後のそれぞれのENDを書き足したストーリーだったでゲソ(◕ ‿‿ ◕ )
No:219|No title
今日ブックオフ行ってマブカプ見たら全然値下げされてなかった…ううむ。困ったものだ

悪いな、C++のこととかは俺全くわからんからコメントしようがねぇんだわw

あとクッキー。ENDを足した記憶はないぞ。俺が足したのは分岐前のgdgdストーリーだ

コメントの投稿

Comment
管理者にだけ表示を許可する
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。