基本に立ち返り「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++から見れば…
邪道だね♪
| 固定リンク
コメント