C++ newによる確保の大きさ.

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
takumi@0832080.com
記事: 38
登録日時: 13年前

C++ newによる確保の大きさ.

#1

投稿記事 by takumi@0832080.com » 13年前

[環境]
OS: Windows7 64bit
CPU: intel corei5-2400
メモリ:8GB

C++を始めたばかりですが,以下の内容が調べても分かりません.
分かる方いましたら教えて戴きたいです.

mallocは指定した大きさのメモリ返すと思うのですが,
newはどの程度の大きさのものが返ってくるのですか?
(よく分からないのでC++なのに以下の様にmallocを無理やり使ってます.)

コード:

class Buffer{
	size_t size;
	void *pointer;

	public:

		Buffer(size_t buf){
			size =0;
			pointer = NULL;
			size = buf;
			pointer = malloc(size);
		}
		~Buffer(){
			if(pointer) free(pointer);
		}
		void* Buffer::GetPointer(){
	                           return this->pointer;
                           }
};

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: C++ newによる確保の大きさ.

#2

投稿記事 by beatle » 13年前

malloc(n) -> nバイト
new T[n] -> sizeof(T) * nバイト
です.
つまり,普通の配列の宣言の様に,確保したい要素数を[n]と書けば,その要素数が丁度入る大きさの領域が確保されます.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++ newによる確保の大きさ.

#3

投稿記事 by softya(ソフト屋) » 13年前

newは指定された型に必要なメモリが確保されて返されますね。型をsizeofしなくて良い分楽です。
あと大きな違いはnewでクラスのインスタンスを生成するとコンストラクタが呼ばれることです。これは重要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

takumi@0832080.com
記事: 38
登録日時: 13年前

Re: C++ newによる確保の大きさ.

#4

投稿記事 by takumi@0832080.com » 13年前

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);
これは同じ動作ということですね.

takumi@0832080.com
記事: 38
登録日時: 13年前

Re: C++ newによる確保の大きさ.

#5

投稿記事 by takumi@0832080.com » 13年前

softya(ソフト屋) さんが書きました:newは指定された型に必要なメモリが確保されて返されますね。型をsizeofしなくて良い分楽です。
あと大きな違いはnewでクラスのインスタンスを生成するとコンストラクタが呼ばれることです。これは重要です。

返信有難うございます.ということは基本はnewを使う方が可読性は高いということですね.勉強になりました.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C++ newによる確保の大きさ.

#6

投稿記事 by softya(ソフト屋) » 13年前

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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

takumi@0832080.com
記事: 38
登録日時: 13年前

Re: C++ newによる確保の大きさ.

#7

投稿記事 by takumi@0832080.com » 13年前

softya(ソフト屋) さんが書きました: まったく違います。
malloc/freeだとコンストラクタ/デストラクタが呼び出されないので支障が出る可能性が高いで基本C++ではmalloc/freeは禁止です。
必ずnew/deleteを使って下さい。さっき書き忘れましたがdeleteならデストラクタが呼び出されます。freeだとメモリが解放されるだけです。

それと
delete[] C_a;
です。配列の時は気を付けましょう。
これからは全てnew/deleteを使おうと思います.
malloc/freeとnew/deleteの違いが分かりました.
delete[] C_a;は気をつけます^^;

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: C++ newによる確保の大きさ.

#8

投稿記事 by beatle » 13年前

なぜ配列にはdelete[]演算子を使うかについて捕捉です.

newにも2種類あります.単体確保用のnewと,配列確保用のnew[]です.
softyaさんが言うように,new, new[]するとコンストラクタが呼び出されます.
new[]を使うと,各要素に対してコンストラクタが呼び出されます.つまり配列の要素数と同じ回数コンストラクタが呼ばれます.
同様に,deleteは単体オブジェクト用のデストラクタ呼び出し,delete[]は配列要素数分のデストラクタ呼び出しをします.

ということで,配列の生成・破棄にはnew[],delete[]を使わないといけません.

たかぎ
記事: 328
登録日時: 15年前
住所: 大阪
連絡を取る:

Re: C++ newによる確保の大きさ.

#9

投稿記事 by たかぎ » 13年前

処理系にもよるので一概には言えないのですが...

配列に対するnewの場合、要素の型がC互換型でなければ、配列の直前に要素数が挿入される実装が多いようです。
具体的には...

コード:

struct A
{
    ~A();
};

int main()
{
    A* ptr = new A[10];
    delete[] ptr;
}
とした場合、new A[10]で割り付けられるサイズはsizeof(A[10])ではなく、少なくともsizeof(A[10])+sizeof(std::size_t)になるというわけです。
(実際には、要素数はstd::size_t型ではないかもしれませんし、境界調整の関係で詰め物が入る可能性もあります)

ここからもわかるように、deleteとdelete[]では、解放するメモリのサイズも違いますし、デストラクタの呼び出し方も異なります。

takumi@0832080.com
記事: 38
登録日時: 13年前

Re: C++ newによる確保の大きさ.

#10

投稿記事 by takumi@0832080.com » 13年前

beatle さんが書きました:なぜ配列にはdelete[]演算子を使うかについて捕捉です.

newにも2種類あります.単体確保用のnewと,配列確保用のnew[]です.
softyaさんが言うように,new, new[]するとコンストラクタが呼び出されます.
new[]を使うと,各要素に対してコンストラクタが呼び出されます.つまり配列の要素数と同じ回数コンストラクタが呼ばれます.
同様に,deleteは単体オブジェクト用のデストラクタ呼び出し,delete[]は配列要素数分のデストラクタ呼び出しをします.

ということで,配列の生成・破棄にはnew[],delete[]を使わないといけません.
捕捉有難うございます. 

takumi@0832080.com
記事: 38
登録日時: 13年前

Re: C++ newによる確保の大きさ.

#11

投稿記事 by takumi@0832080.com » 13年前

たかぎ さんが書きました:処理系にもよるので一概には言えないのですが...

配列に対するnewの場合、要素の型がC互換型でなければ、配列の直前に要素数が挿入される実装が多いようです。
具体的には...

コード:

struct A
{
    ~A();
};

int main()
{
    A* ptr = new A[10];
    delete[] ptr;
}
とした場合、new A[10]で割り付けられるサイズはsizeof(A[10])ではなく、少なくともsizeof(A[10])+sizeof(std::size_t)になるというわけです。
(実際には、要素数はstd::size_t型ではないかもしれませんし、境界調整の関係で詰め物が入る可能性もあります)

ここからもわかるように、deleteとdelete[]では、解放するメモリのサイズも違いますし、デストラクタの呼び出し方も異なります。
今回のお題とは関係無いですが,構造体にコンストラクタ/デストラクタがあったのは知らなかったです.
捕捉有難うございます.

たかぎ
記事: 328
登録日時: 15年前
住所: 大阪
連絡を取る:

Re: C++ newによる確保の大きさ.

#12

投稿記事 by たかぎ » 13年前

takumi@0832080.com さんが書きました:今回のお題とは関係無いですが,構造体にコンストラクタ/デストラクタがあったのは知らなかったです.
捕捉有難うございます.
C++では、構造体はクラスの一種です(もっといえば共用体もクラスの一種です)。
ですので、コンストラクタやデストラクタも持てますし、それ以外のメンバ関数も持てます。

閉鎖

“C言語何でも質問掲示板” へ戻る