- 締切済み
newと配列?
基本的な質問になるのですが、 例が書かれているサイトが見つからない為、質問とさせていただきたいと思います。 自分はUNIXでCの開発を行っていたのですが、C++に関してはよくわかりません。 CString a[10]; と CString a = new CString[10]; の違いを教えていただけないでしょうか? newを行い、deleteをすることで、 コンストラクタ、デストラクタを呼び出せる事はわかるのですが、 それ以外の違いはどのような点になるのですか? インスタンスについて理解できていないのでこのような 基本的な質問となりますが、ご教授願います。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- KoHal
- ベストアンサー率60% (110/181)
CString a[10]; //---A CString* a = new CString[10]; //---B Aでもコンストラクタは呼ばれますよ。aがスコープを外れるときはデストラクタも呼ばれます。 new の役割はヒープ領域に必要なメモリを確保した上でコンストラクタを呼ぶ。確保した領域の(先頭要素への)ポインタを返す。 delete はデストラクタを呼び出した上で領域を開放する。 Aでもコンストラクタ/デストラクタは呼ばれますから、両者の違いはaまたはaが指すオブジェクトがスタック上にあるかヒープ上にある(それゆえ明示的に開放する必要がある)かです。 あ、勿論aの型も違いますが。
- jacta
- ベストアンサー率26% (845/3158)
CStringというのはMFCのCStringでしょうか? まず、CString a = new CString[10];というのは間違っています。new演算子の結果はポインタに格納しなければなりません。 C言語は分かるようなので、C言語風に書き直すと、 CString* a = new CString[10]; というのは、 CString* a = malloc(sizeof(CString) * 10); int i; for (i = 0; i < 10; i++) construct(a + i); のような意味になります。 (正確にはnewとmallocはまったく別の概念ですが) それはそうと、配列をnewするよりvectorを使う方が便利で安全です。
- keroro001
- ベストアンサー率23% (71/304)
CString a[10]; と宣言すると、その関数の中でしか使えません。 newしたものは、戻り値として返ってきた関数でインスタンスとして使用できます。 その場合、戻り値で返ってきた関数の方でdeleteしなければいけません。 これはCString a[10];だとスタック上にメモリが確保され、関数から戻った時点で そのメモリが開放されて無効になるためです。 newの場合はグローバルヒープ上にメモリが確保されるため、deleteされるまでは メモリが確保され続けているため関数から戻ったあともつかえるのです。 あぁちょっとあやふや・・・自信なしでお願いします。