![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
基本的な質問になるのですが、
例が書かれているサイトが見つからない為、質問とさせていただきたいと思います。
自分はUNIXでCの開発を行っていたのですが、C++に関してはよくわかりません。
CString a[10]; と
CString a = new CString[10];
の違いを教えていただけないでしょうか?
newを行い、deleteをすることで、
コンストラクタ、デストラクタを呼び出せる事はわかるのですが、
それ以外の違いはどのような点になるのですか?
インスタンスについて理解できていないのでこのような
基本的な質問となりますが、ご教授願います。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
CString a[10]; //---A
CString* a = new CString[10]; //---B
Aでもコンストラクタは呼ばれますよ。aがスコープを外れるときはデストラクタも呼ばれます。
new の役割はヒープ領域に必要なメモリを確保した上でコンストラクタを呼ぶ。確保した領域の(先頭要素への)ポインタを返す。
delete はデストラクタを呼び出した上で領域を開放する。
Aでもコンストラクタ/デストラクタは呼ばれますから、両者の違いはaまたはaが指すオブジェクトがスタック上にあるかヒープ上にある(それゆえ明示的に開放する必要がある)かです。
あ、勿論aの型も違いますが。
No.2
- 回答日時:
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を使う方が便利で安全です。
No.1
- 回答日時:
CString a[10];
と宣言すると、その関数の中でしか使えません。
newしたものは、戻り値として返ってきた関数でインスタンスとして使用できます。
その場合、戻り値で返ってきた関数の方でdeleteしなければいけません。
これはCString a[10];だとスタック上にメモリが確保され、関数から戻った時点で
そのメモリが開放されて無効になるためです。
newの場合はグローバルヒープ上にメモリが確保されるため、deleteされるまでは
メモリが確保され続けているため関数から戻ったあともつかえるのです。
あぁちょっとあやふや・・・自信なしでお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- 中学校 Do you want a new bag? Want you a new bag? この二つの違い 3 2022/07/30 15:55
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Microsoft ASP C#からvbsを実行したい 5 2022/11/24 17:31
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- Java インスタンス ダウンキャストについて以下の解釈であっているか教えて欲しいです。 サブクラスをスーパー 1 2022/03/27 18:53
- Visual Basic(VBA) FileSearch2007に変わる構文について 1 2022/12/16 16:57
- 教えて!goo 質問サイトで読解力がない奴と話すとイライラします。こういう人の対処法を教えてください。 22 2022/09/12 08:44
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- その他(IT・Webサービス) Android タブレット用 (出来れば)動画編集ソフト 皆さんこんばんわ、質問させてください 【2 4 2023/08/05 21:37
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
配列の添え字の最大数とは?
-
レジストリ値の取得
-
指定したメモリアドレスの値の...
-
mallocについて
-
ヒープメモリの解放について
-
malloc呼び出し時のセグメンテ...
-
構造体でchar name[]と*nameの...
-
mallocで確保するメモリの領域...
-
C++のnewで確保したメモリーの...
-
C言語に関する質問
-
void*型のデータサイズ
-
malloc関数(strtok関数の自作版...
-
VBからMFC-DLL呼び出し
-
x64環境で連続4GB以上のメモリ...
-
win32APIのHeapAlloc()の使い方...
-
メモリをたくさん使うテストプ...
-
16進ダンプのプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
mallocについて
-
newしないオブジェクトについて
-
allocってなんですか?
-
配列の添え字の最大数とは?
-
ヒープメモリの解放について
-
プログラムが途中で強制終了し...
-
Accessで、メモリを開放するタ...
-
malloc呼び出し時のセグメンテ...
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
void*型のデータサイズ
-
入れ子になった構造体について
-
C言語に関する質問
-
スタック破壊の上手な見つけ方...
-
mallocで確保するメモリの領域...
-
C++のnewで確保したメモリーの...
-
指定したメモリアドレスの値の...
-
ヒープ領域の限界値設定
-
構造体でchar name[]と*nameの...
おすすめ情報