« パティシエが作ったスイーツ…? | トップページ | ちょっと得したか微妙なチロルチョコ。 »

2007年5月27日 (日)

基本に立ち返り「new/new[]」の違いって?

あまりに基本過ぎて…
ちょっと考えたら分かりました…。(笑)

だた対象が「new char[10];/new float[10]」とかで
「malloc( sizeof( char[10] ) );malloc( sizeof( float ) * 10 ) );」
と「何が違うんだろ~」などとぼんやり考え込んじゃった…。

これは、「template< typename TYPE >」関連を調べていた時に
「TYPE」の対象が「int/float」だったから「はて?」と思ったわけですが…。
「TYPE」にクラスもある事を失念していました…。<馬鹿です。
まあ、分かったから良いか…。

でも、ネットで調べたら
『「new」と「malloc」を一緒に使うといけない』
みたいな事が書いてあったりして…。

でも「new」の中でメモリーを確保しているの「malloc」だし…。
例えば、以下「new/delete」を「malloc/free」に置き換えると…
    a = new class A;
    ...
    delete a;
は、こんな感じに書き換えられる。
    a = ( class A* )malloc( sizeof( *a ) );
    a->A( );//※この参照は、実際に出来ません。イメージです。(笑)
    ...
    a->~A( );//※こちらは、記述は可能。でも処理しない。(笑)
    free( a );
※あくまでもC++風で記述したイメージです。
実際には、こう書いても動きません。(爆)

でも、良く読むと…
処理には、初期化と開放がセットになっているので
その『対を間違えて使うな』だそうだ…。

以下は、「new/malloc」混在のサンプル。

#include<stdio.h>
#include<stdlib.h>
class C {
    public:
    C( ){ printf( "コンストラクタ\n" ); }
    ~C( ){ printf( "ディストラクタ\n" ); }
};
void main()
{
    C *A;
    printf( "new-delete\n" );
    A    = new C;
    delete A;
    printf( "malloc-delete\n" );
    A    = ( C* )malloc(sizeof( *A ) );
    delete A;
    printf( "new-free\n" );
    A    = new C;
    free( A );
}

まあ上記は、「new」に「malloc」が使われている証明ですね。
クラスに「malloc」を使っても…
コンストラクタが無ければ「同じ!」だと言いたい。
デストラクタが無ければ「free」だってOK。

分かって使うのなら、敢えて違えて使うなどと言うのもありかも…
…いや、無いです!

他の人が見て分からないようなソースは、
書かないようにしましょう!

「malloc:free/new:delete/new[]:delete[]」を誤った対で使用すると
とっても不幸になると思います…。

ちなみにコンストラクタで0クリアで良ければ、こんな記述も良いのでは?
    ZeroMemory( this, sizeof( *this ) );
これだとメンバーの増減や個別処理を考えなくて良いので便利。
もちろん分かって使うのが条件付ですが…。
例えば「virtual」が有ると細工が必要になります…。

ちなみに今回の内容は、正統派C++から見れば…
邪道だね♪

|

« パティシエが作ったスイーツ…? | トップページ | ちょっと得したか微妙なチロルチョコ。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/15215927

この記事へのトラックバック一覧です: 基本に立ち返り「new/new[]」の違いって?:

« パティシエが作ったスイーツ…? | トップページ | ちょっと得したか微妙なチロルチョコ。 »