VC++6.0 newでのメモリ確保

解決


maru  2004-11-27 02:14:31  No: 55364

はじめまして。簡単な質問なので検索したのですがないようなので
掲示します。

char型でnewを用いてメモリ確保した場合、NULLクリアされていますか。
C言語では、NULLクリアをしていましたが、VC++ではどうなのでしょうか。

よろしくお願い致します。


  2004-11-27 02:37:11  No: 55365

実際に自分で中身を調べてみればわかります
以下のコードはnewで確保しただけの変数に
実際に何が入っているか調べるものです

char*  pc;
int*  pi;

pc  = new char;
pi  = new int;
cout << "*pc = " << (int)(*pc) << endl;
cout << "*pi = " << *pi << endl;
delete pc;
delete pi;

実行してみましょう

ちなみにC言語のcallocは0でクリアされることが約束されているはずですが、
mallocなどはその保証はないはずなので、
「C言語でのメモリ確保=0でクリアされる」
という認識をしているとしたら危険だと思います


KING・王  2004-11-27 02:37:50  No: 55366

> C言語では、NULLクリアをしていましたが、VC++ではどうなのでしょうか。

C言語で、malloc()を用いたということでしょうか?
それなら、NULLクリアされていることは、保証されませんが。。。
calloc()ならば、malloc() + 0x00でのクリアなので、
NULLクリアが保証されますが。。。


Ban  2004-11-27 03:01:55  No: 55367

> C言語では、NULLクリアをしていましたが、VC++ではどうなのでしょうか。

C言語では、(自分で)NULLクリアをしていましたが、VC++ではどうなのでしょうか。
(=その必要はあるのでしょうか)

という意味に取って欲しいのではないかと思ったり。

そういう私も最初はお二方と同じような誤解があるのかと思ったのですけど。
自然言語は難しい。


maru  2004-11-27 03:08:44  No: 55368

いろいろありがとうございます。
もう1度、実際に中身を見たいと思います。

有難うございました。


maru  2004-11-27 03:09:41  No: 55369

解決のチェックを忘れていました。


RAPT  2004-11-28 09:32:00  No: 55370

operator new のソースを見れば分かるが、内部で malloc している。。


undefined name  2004-11-28 10:14:33  No: 55371

> operator new のソースを見れば分かるが、内部で malloc している。。

コンストラクタなどの初期化は new で確保されたその後に
実行される。よって new のソースをもって疑問の回答にはならない。


tetrapod  2004-11-28 20:36:42  No: 55372

POD 型のコンストラクタはちょっと特殊?な動きをするので注意。
括弧なし構築では「何もしない初期化」がなされるのに対して
括弧つき構築では「0初期化」がされます。
(言語規格書でそう決まっています  8.5 Initializers)

int x; // 「なにもしない初期化」がなされる; 値は不定
int y(); // 関数宣言になるため y を初期化する構文とみなされない
template<class T> T create_object() { return T(); }
int z=create_object<int>(); // 「0初期化」がなされる; 値は0
# ここまでは gcc/bcc/vc++ みな共通に使える

同じことが new でも言えて、
int* x=new int; // 「なにもしない初期化」がなされる; 値は不定
int* y=new int(); // 「0初期化」がなされる; 値は0
# VC++6 はこの規格確定より古い処理系なので、後者が仕様書どおりではありません。


RAPT  2004-11-30 10:13:22  No: 55373

> > operator new のソースを見れば分かるが、内部で malloc している。。
> コンストラクタなどの初期化は new で確保されたその後に
> 実行される。よって new のソースをもって疑問の回答にはならない。

コンストラクタについては、既にtetrapodさんがレスをつけていますが、
コンストラクタ以前までの問題として回答しました。


undefined name  2004-11-30 12:08:36  No: 55374

>RAPT殿

  メモリ確保の実装例はメモリ確保後に初期化が行われるかという質問とは
  直接関係ない参考情報ですが当初は
  > コンストラクタ以前までの問題として回答しました。
  という説明がなかったため、逆に「初期化されない傍証に見える」誤誘導の
  可能性があると思って、わかる範囲で指摘させてもらったものです。
  単に私が自意識過剰ならいいのですが、それ以上の他意はありませんので
  私の指摘が気に障られたのであれば申し訳ないです。


RAPT  2004-12-01 10:45:53  No: 55375

>undefined name 様
言葉が不足していたようですね。
質問者がmallocとnewではメモリの確保方法が異なっていると
思ったのかなぁ、と思いましたので、上記のような回答で、
ベース部分は同じだったりする、といいたかったのです。
# operator new のオーバーライドやテンプレートのアロケータ
# とか出てくると別物ですが。

フォローありがとうございます。


mvs  2005-07-15 22:45:23  No: 55376

new char(size,0x00)


YuO  2005-07-16 00:04:45  No: 55377

> new char(size,0x00)
何がしたいのでしょうか……というか,この文法エラーのコード断片は一体……?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加