C++ newによる確保の大きさ.
-
- 記事: 38
- 登録日時: 13年前
C++ newによる確保の大きさ.
[環境]
OS: Windows7 64bit
CPU: intel corei5-2400
メモリ:8GB
C++を始めたばかりですが,以下の内容が調べても分かりません.
分かる方いましたら教えて戴きたいです.
mallocは指定した大きさのメモリ返すと思うのですが,
newはどの程度の大きさのものが返ってくるのですか?
(よく分からないのでC++なのに以下の様にmallocを無理やり使ってます.)
OS: Windows7 64bit
CPU: intel corei5-2400
メモリ:8GB
C++を始めたばかりですが,以下の内容が調べても分かりません.
分かる方いましたら教えて戴きたいです.
mallocは指定した大きさのメモリ返すと思うのですが,
newはどの程度の大きさのものが返ってくるのですか?
(よく分からないのでC++なのに以下の様にmallocを無理やり使ってます.)
Re: C++ newによる確保の大きさ.
malloc(n) -> nバイト
new T[n] -> sizeof(T) * nバイト
です.
つまり,普通の配列の宣言の様に,確保したい要素数を[n]と書けば,その要素数が丁度入る大きさの領域が確保されます.
new T[n] -> sizeof(T) * nバイト
です.
つまり,普通の配列の宣言の様に,確保したい要素数を[n]と書けば,その要素数が丁度入る大きさの領域が確保されます.
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: C++ newによる確保の大きさ.
newは指定された型に必要なメモリが確保されて返されますね。型をsizeofしなくて良い分楽です。
あと大きな違いはnewでクラスのインスタンスを生成するとコンストラクタが呼ばれることです。これは重要です。
あと大きな違いはnewでクラスのインスタンスを生成するとコンストラクタが呼ばれることです。これは重要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 38
- 登録日時: 13年前
Re: C++ newによる確保の大きさ.
返信有難うございます.例えばbeatle さんが書きました:malloc(n) -> nバイト
new T[n] -> sizeof(T) * nバイト
です.
つまり,普通の配列の宣言の様に,確保したい要素数を[n]と書けば,その要素数が丁度入る大きさの領域が確保されます.
ClassA *C_a = new ClassA[10] ;
delete(C_a);
と
ClassA *C_a = (ClassA *) malloc(sizeof(ClassA *)*10) ;
free(C_a);
これは同じ動作ということですね.
-
- 記事: 38
- 登録日時: 13年前
Re: C++ newによる確保の大きさ.
softya(ソフト屋) さんが書きました:newは指定された型に必要なメモリが確保されて返されますね。型をsizeofしなくて良い分楽です。
あと大きな違いはnewでクラスのインスタンスを生成するとコンストラクタが呼ばれることです。これは重要です。
返信有難うございます.ということは基本はnewを使う方が可読性は高いということですね.勉強になりました.
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: C++ newによる確保の大きさ.
takumi@0832080.com さんが書きました:ClassA *C_a = new ClassA[10] ;
delete(C_a);
と
ClassA *C_a = (ClassA *) malloc(sizeof(ClassA *)*10) ;
free(C_a);
まったく違います。takumi@0832080.com さんが書きました: 返信有難うございます.ということは基本はnewを使う方が可読性は高いということですね.勉強になりました.
malloc/freeだとコンストラクタ/デストラクタが呼び出されないので支障が出る可能性が高いで基本C++ではmalloc/freeは禁止です。
必ずnew/deleteを使って下さい。さっき書き忘れましたがdeleteならデストラクタが呼び出されます。freeだとメモリが解放されるだけです。
それと
delete[] C_a;
です。配列の時は気を付けましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 38
- 登録日時: 13年前
Re: C++ newによる確保の大きさ.
これからは全てnew/deleteを使おうと思います.softya(ソフト屋) さんが書きました: まったく違います。
malloc/freeだとコンストラクタ/デストラクタが呼び出されないので支障が出る可能性が高いで基本C++ではmalloc/freeは禁止です。
必ずnew/deleteを使って下さい。さっき書き忘れましたがdeleteならデストラクタが呼び出されます。freeだとメモリが解放されるだけです。
それと
delete[] C_a;
です。配列の時は気を付けましょう。
malloc/freeとnew/deleteの違いが分かりました.
delete[] C_a;は気をつけます^^;
Re: C++ newによる確保の大きさ.
なぜ配列にはdelete[]演算子を使うかについて捕捉です.
newにも2種類あります.単体確保用のnewと,配列確保用のnew[]です.
softyaさんが言うように,new, new[]するとコンストラクタが呼び出されます.
new[]を使うと,各要素に対してコンストラクタが呼び出されます.つまり配列の要素数と同じ回数コンストラクタが呼ばれます.
同様に,deleteは単体オブジェクト用のデストラクタ呼び出し,delete[]は配列要素数分のデストラクタ呼び出しをします.
ということで,配列の生成・破棄にはnew[],delete[]を使わないといけません.
newにも2種類あります.単体確保用のnewと,配列確保用のnew[]です.
softyaさんが言うように,new, new[]するとコンストラクタが呼び出されます.
new[]を使うと,各要素に対してコンストラクタが呼び出されます.つまり配列の要素数と同じ回数コンストラクタが呼ばれます.
同様に,deleteは単体オブジェクト用のデストラクタ呼び出し,delete[]は配列要素数分のデストラクタ呼び出しをします.
ということで,配列の生成・破棄にはnew[],delete[]を使わないといけません.
Re: C++ newによる確保の大きさ.
処理系にもよるので一概には言えないのですが...
配列に対するnewの場合、要素の型がC互換型でなければ、配列の直前に要素数が挿入される実装が多いようです。
具体的には...
とした場合、new A[10]で割り付けられるサイズはsizeof(A[10])ではなく、少なくともsizeof(A[10])+sizeof(std::size_t)になるというわけです。
(実際には、要素数はstd::size_t型ではないかもしれませんし、境界調整の関係で詰め物が入る可能性もあります)
ここからもわかるように、deleteとdelete[]では、解放するメモリのサイズも違いますし、デストラクタの呼び出し方も異なります。
配列に対するnewの場合、要素の型がC互換型でなければ、配列の直前に要素数が挿入される実装が多いようです。
具体的には...
とした場合、new A[10]で割り付けられるサイズはsizeof(A[10])ではなく、少なくともsizeof(A[10])+sizeof(std::size_t)になるというわけです。
(実際には、要素数はstd::size_t型ではないかもしれませんし、境界調整の関係で詰め物が入る可能性もあります)
ここからもわかるように、deleteとdelete[]では、解放するメモリのサイズも違いますし、デストラクタの呼び出し方も異なります。
-
- 記事: 38
- 登録日時: 13年前
Re: C++ newによる確保の大きさ.
捕捉有難うございます.beatle さんが書きました:なぜ配列にはdelete[]演算子を使うかについて捕捉です.
newにも2種類あります.単体確保用のnewと,配列確保用のnew[]です.
softyaさんが言うように,new, new[]するとコンストラクタが呼び出されます.
new[]を使うと,各要素に対してコンストラクタが呼び出されます.つまり配列の要素数と同じ回数コンストラクタが呼ばれます.
同様に,deleteは単体オブジェクト用のデストラクタ呼び出し,delete[]は配列要素数分のデストラクタ呼び出しをします.
ということで,配列の生成・破棄にはnew[],delete[]を使わないといけません.
-
- 記事: 38
- 登録日時: 13年前
Re: C++ newによる確保の大きさ.
今回のお題とは関係無いですが,構造体にコンストラクタ/デストラクタがあったのは知らなかったです.たかぎ さんが書きました:処理系にもよるので一概には言えないのですが...
配列に対するnewの場合、要素の型がC互換型でなければ、配列の直前に要素数が挿入される実装が多いようです。
具体的には...
とした場合、new A[10]で割り付けられるサイズはsizeof(A[10])ではなく、少なくともsizeof(A[10])+sizeof(std::size_t)になるというわけです。
(実際には、要素数はstd::size_t型ではないかもしれませんし、境界調整の関係で詰め物が入る可能性もあります)
ここからもわかるように、deleteとdelete[]では、解放するメモリのサイズも違いますし、デストラクタの呼び出し方も異なります。
捕捉有難うございます.
Re: C++ newによる確保の大きさ.
C++では、構造体はクラスの一種です(もっといえば共用体もクラスの一種です)。takumi@0832080.com さんが書きました:今回のお題とは関係無いですが,構造体にコンストラクタ/デストラクタがあったのは知らなかったです.
捕捉有難うございます.
ですので、コンストラクタやデストラクタも持てますし、それ以外のメンバ関数も持てます。