掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7599

new演算子の引数
投稿者---zig(2007/06/22 17:22:18)


void *operator new(size_t size){
return MALLOC(size);
}
というふうに new 演算子の定義があり、

HSPosition dlgPos = new HSPosition();
こういうふうにインスタンスを作成していたのですが、

コンストラクタHSPosition()は new の引数に入るt_size型の値を
返しているのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:new演算子の引数 7603 かずま 2007/06/23 15:45:02


No.7603

Re:new演算子の引数
投稿者---かずま(2007/06/23 15:45:02)


> HSPosition dlgPos = new HSPosition();
> こういうふうにインスタンスを作成していたのですが、
HSPosition *dlgPos = new HSPosition();
の間違いではありませんか?


> コンストラクタHSPosition()は new の引数に入るt_size型の値を
> 返しているのでしょうか?

コンストラクタは値を返しません。
確保された領域に対して、何か(初期化)をするだけです。

new HSPosition と new HSPosition() は同じ意味です。
この new 演算子により、sizeof(HSPosition) の値を引数として
operator new 関数が呼び出されます。
その後返されたポインタの指す領域に対して、コンストラクタが実行
されます。
そして、new 演算子はそのポインタの値を返します。



この投稿にコメントする

削除パスワード

No.7605

Re:new演算子の引数
投稿者---zig(2007/06/24 07:29:53)


返信ありがとうございます。

> HSPosition *dlgPos = new HSPosition();
> の間違いではありませんか?

そうでした。すいません。

> その後返されたポインタの指す領域に対して、コンストラクタが実行
> されます。

コンストラクタより、new関数の方が先に実行されるということですか。

> この new 演算子により、sizeof(HSPosition) の値を引数として
> operator new 関数が呼び出されます。

今やってる環境はnew演算子が無く、自分で定義しなければいけません。
例に挙げたnew演算子のサンプルで正常に動くんですが、
動いてる仕組みがよくわからず不安なのです。。。

何故この書き方でsizeof(HSPosition)が引数に入るのか、良くわからないのですが、
自分で定義したものでも、newの引数にはt_sizeが入るようになってるのでしょうか。
それとも、t_size型が特殊なのか、関数じゃなくて演算子だからなのか、
コンストラクタを書くとそうなるようになってるのか、
詳しい仕様を知ってたら、教えてもらえるとありがたいです。


この投稿にコメントする

削除パスワード

No.7606

Re:new演算子の引数
投稿者---へろり(2007/06/24 08:10:16)


>何故この書き方でsizeof(HSPosition)が引数に入るのか、良くわからないのですが、
>自分で定義したものでも、newの引数にはt_sizeが入るようになってるのでしょうか。
>それとも、t_size型が特殊なのか、関数じゃなくて演算子だからなのか、
>コンストラクタを書くとそうなるようになってるのか、
>詳しい仕様を知ってたら、教えてもらえるとありがたいです。

なぜ new するのかを考えてみればすぐに分かると思うのですが。
とりあえずコンストラクタを抜きに new HSPosition; とした場合を、
考えてみると良いかもしれません。

new HSPosition; では、クラス HSPosition のインスタンスを生成します。
つまり HSPosition を格納する領域を確保しなければなりません。
故に、HSPosition のサイズが必要です。




この投稿にコメントする

削除パスワード

No.7612

Re:new演算子の引数
投稿者---zig(2007/06/26 09:50:17)


遅くなってしまいましたが、どうもありがとうございます。

> new HSPosition; では、クラス HSPosition のインスタンスを生成します。
> つまり HSPosition を格納する領域を確保しなければなりません。
> 故に、HSPosition のサイズが必要です。

Javaしかやったことがなく、new HSPosition という書き方は初めて見るのですが、
インスタンスを格納するメモリを確保する為に、サイズが必要ということは分かってます。
分からないのは、どういう書き方をしたらサイズが取れるのかということです。

例えば、new ではなく

void * Generate_Instance(size_t size){
return MALLOC(size);
}

という関数にした場合でも

HSPosition * dlgPos = Generate_Instance(HSPosition());

これでインスタンス作成できるのか、というようなことです。


この投稿にコメントする

削除パスワード

No.7613

Re:new演算子の引数
投稿者---YuO(2007/06/26 10:51:04)


>例えば、new ではなく
>void * Generate_Instance(size_t size){
>return MALLOC(size);
>}
>
>という関数にした場合でも
>HSPosition * dlgPos = Generate_Instance(HSPosition());
>これでインスタンス作成できるのか、というようなことです。

できません。
# まぁ,インスタンスっぽいものはできているように見えるかもしれませんが。

new演算子はメモリを確保するための物ではなく,インスタンスを作成するための物です。
つまり,主目的はコンストラクタを走らせることです。
# new演算子に関して,JavaはC++から受け継いでいます。

そして,new演算子がインスタンスを作成する過程で必要になる記憶域を確保するための関数が,operator newです。
operator newはnew演算子の動作を再定義しているわけではないことに注意して下さい。
# operator newとnew演算子は別物です。



この投稿にコメントする

削除パスワード

No.7615

Re:new演算子の引数
投稿者---へろり(2007/06/26 11:40:08)


>インスタンスを格納するメモリを確保する為に、サイズが必要ということは分かってます。
>分からないのは、どういう書き方をしたらサイズが取れるのかということです。
>
ようやく質問の意図を理解しました。

これはサイズを”取る”と言うものではなく、new式には、サイズが与えられる
と、いうのが仕様で決められいます。

X3014 3.5.4-10 より≪new式≫は、必要とする領域の大きさを、型std::size_tをもつ第一引数として
割付け関数に渡す。

とあります。


この投稿にコメントする

削除パスワード

No.7626

ありがとうございます
投稿者---zig(2007/06/28 16:37:28)


YuOさん、へろりさんありがとうございます。

> operator newはnew演算子の動作を再定義しているわけではないことに注意して下さい。
> # operator newとnew演算子は別物です。

> これはサイズを”取る”と言うものではなく、new式には、サイズが与えられる
> と、いうのが仕様で決められいます。

やっと謎が解けました。
new演算子は最初から、仕様として特殊な機能を持っているのですね。
そして、operator new 関数はnew演算子自体を定義しているのでなく、
new演算子の処理の一部(メモリ確保部分)を定義しているということですか。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ