はじめまして。簡単な質問なので検索したのですがないようなので
掲示します。
char型でnewを用いてメモリ確保した場合、NULLクリアされていますか。
C言語では、NULLクリアをしていましたが、VC++ではどうなのでしょうか。
よろしくお願い致します。
実際に自分で中身を調べてみればわかります
以下のコードは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でクリアされる」
という認識をしているとしたら危険だと思います
> C言語では、NULLクリアをしていましたが、VC++ではどうなのでしょうか。
C言語で、malloc()を用いたということでしょうか?
それなら、NULLクリアされていることは、保証されませんが。。。
calloc()ならば、malloc() + 0x00でのクリアなので、
NULLクリアが保証されますが。。。
> C言語では、NULLクリアをしていましたが、VC++ではどうなのでしょうか。
C言語では、(自分で)NULLクリアをしていましたが、VC++ではどうなのでしょうか。
(=その必要はあるのでしょうか)
という意味に取って欲しいのではないかと思ったり。
そういう私も最初はお二方と同じような誤解があるのかと思ったのですけど。
自然言語は難しい。
いろいろありがとうございます。
もう1度、実際に中身を見たいと思います。
有難うございました。
解決のチェックを忘れていました。
operator new のソースを見れば分かるが、内部で malloc している。。
> operator new のソースを見れば分かるが、内部で malloc している。。
コンストラクタなどの初期化は new で確保されたその後に
実行される。よって new のソースをもって疑問の回答にはならない。
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 はこの規格確定より古い処理系なので、後者が仕様書どおりではありません。
> > operator new のソースを見れば分かるが、内部で malloc している。。
> コンストラクタなどの初期化は new で確保されたその後に
> 実行される。よって new のソースをもって疑問の回答にはならない。
コンストラクタについては、既にtetrapodさんがレスをつけていますが、
コンストラクタ以前までの問題として回答しました。
>RAPT殿
メモリ確保の実装例はメモリ確保後に初期化が行われるかという質問とは
直接関係ない参考情報ですが当初は
> コンストラクタ以前までの問題として回答しました。
という説明がなかったため、逆に「初期化されない傍証に見える」誤誘導の
可能性があると思って、わかる範囲で指摘させてもらったものです。
単に私が自意識過剰ならいいのですが、それ以上の他意はありませんので
私の指摘が気に障られたのであれば申し訳ないです。
>undefined name 様
言葉が不足していたようですね。
質問者がmallocとnewではメモリの確保方法が異なっていると
思ったのかなぁ、と思いましたので、上記のような回答で、
ベース部分は同じだったりする、といいたかったのです。
# operator new のオーバーライドやテンプレートのアロケータ
# とか出てくると別物ですが。
フォローありがとうございます。
new char(size,0x00)
> new char(size,0x00)
何がしたいのでしょうか……というか,この文法エラーのコード断片は一体……?
ツイート | ![]() |