• ベストアンサー

newについて

newを使った場合、3バイト分確保したつもりでしたが、7バイト?になります。どうしてでしょうか? newした場合はdeleteをしないといけませんが、deleteした後にNULLで初期化する意味はあるのでしょうか? CとC++が混在?(newはC++かな?)しているソースなのですが、 現場(クリティカルな開発)ではこういう書き方はNGでしょうか? 組み込み系のお仕事をされている方の意見も聞きたいです。 #include <string.h> void main(void){ char *cstr = new char [3]; printf("%d\n", strlen(cstr)); // 3を期待していたのですが、7になります。 if (cstr != NULL){ delete cstr; cstr = NULL; } }

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> newを使った場合、3バイト分確保したつもりでしたが、7バイト?になります。どうしてでしょうか? 領域は割付けても、その内容は不定だからです。 > newした場合はdeleteをしないといけませんが、 newした場合でも、常にdeleteしないといけないわけではありませんが... > deleteした後にNULLで初期化する意味はあるのでしょうか? すでにdeleteしたポインタを誤って使ってしまわないようにするための対策です。 > CとC++が混在?(newはC++かな?)しているソースなのですが、 こういうのは混在しているとはいいません。 > 現場(クリティカルな開発)ではこういう書き方はNGでしょうか? クリティカルな開発というのが何を意味するのか分かりませんが... 少なくとも、未初期化のchar配列に対してstrlenを呼び出すのはNGです。 > 組み込み系のお仕事をされている方の意見も聞きたいです。 組込み系といっても、環境がさまざまですので一概には言えません。 OSなしの環境と、μITRONのような簡易なOSの環境と、LinuxやWindowsCEのような環境では、まったく事情が異なります。

その他の回答 (2)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

>newを使った場合、3バイト分確保したつもりでしたが、7バイト?になります。どうしてでしょうか? newしただけでは3バイトの内容は不定です。 文字列の終端は\0(0x00)ですから、\0が見つかるまでが文字列の長さということになります。たまたま、8バイト目に\0があったのでしょう。 newした文字列の領域は自分で\0を書き込むか、strcpyするときは\0を含めて3バイト以内になるように自分で面倒を見る必要があります。コンパイラは何もガードしてくれません。 >newした場合はdeleteをしないといけませんが、deleteした後にNULLで初期化する意味はあるのでしょうか? cstrをNULLにすることで領域の解法を明示的に表現します。LinuxなどでNULLにされた値を使ったらメモリ保護例外になりますし、他の環境でもcstrがNULLだったらエラーにする処理をあちこちに埋め込んでトラブルをガードする事ができます。 >CとC++が混在?(newはC++かな?)しているソースなのですが、 >現場(クリティカルな開発)ではこういう書き方はNGでしょうか? >組み込み系のお仕事をされている方の意見も聞きたいです。 CとC++の書き方を混ぜることは普通しません。読むほうもややこしくなりますから。開発の現場では、コーディング規約でどちらかに統一されているはずです。 最近質問を多くされてますが、締め切っていない質問が沢山あるみたいです。回答に不十分な部分があればお礼などで補足を求めてはどうでしょうか?満足したのなら締め切ってください。 ほとんど問い返されないので回答がうまく伝わっているのか疑問に思っています。こういう場は、お互いに情報交換しないと解決に持っていくことが難しい場合が多いですから、tobasuさんもうまく回答者コミュニケーションを取ってくださいね。 今回のnewの問題も今までの回答者の言いたいことが伝わってないんじゃないと感じました。

tobasu
質問者

お礼

わかりやすいご説明ありがとうございます。 回答を見た直後では、正直理解しておりませんが、2-3日すると少し理解できるので、しばらく申し訳ないのですが放置しています。 最終的にこの回答で解決したと断言できるのは、だいたい1週間後以降になり、それで締め切りが遅れております。 独学なので体系的に理解していなく、CとC++の過渡期の時期に、学ぶ機会を逃したので、テンプレートやstd::系の知識が0でC++を使いこなせていません。 今後もいろいろ質問させていただきますが、よろしくお願いいたします。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>printf("%d\n", strlen(cstr)); // 3を期待していたのですが、7になります。 strlen() は最初に \0 が現れるまでをカウントするので、中身の入っていない配列については、「どこまで数えられるか」予測できません。 >deleteした後にNULLで初期化する意味はあるのでしょうか? 多分、どこか別の場所で delete cstr; としたときに、領域が二重に開放されることがないように、という意図ではないでしょうか。