2016-08-04 14 views
-1

std :: vector.reserve()メソッドがベクトルの容量を予約し、予約されているが値で手動で初期化されていないベクトルにアクセスすると、未定義の動作につながることがあります。しかし、私はreserve()メソッドが割り当てられたメモリに何かを実際に埋め込むので、初期化されていないメモリ割り当てはできないと言われました。だから、C++で初期化されていないメモリを割り当てる方法はありますか?(mcalloc()はどのようにcのために働くのでしょうか?C++の初期化されていないメモリ割り当て

EDIT:申し訳ありませんが、私は間違った単語をここに入れました。これはmcalloc()がcでどのように動作するかのようにする必要があります。私はそれを変更しました。

+0

'calloc()がcのためにどのように働くのか... ..あなたは冗談か深刻ですか?それは180度反対の声明のようです。 –

+0

'calloc'は初期化されたメモリを割り当てます。初期化されていないメモリをC++に割り当てるには、 'malloc'がCのためにどのように動作するかのように、' malloc'を使うことです。 'calloc'がC言語でどのように動作するかのように、C++でメモリを割り当てる方法もあります:' calloc'を使うことです – wasthishelpful

+0

答えは少しばらつきます。 'std :: vector'があなたの要点質問または単なる例ですか?ベクタの中に初期化されていないオブジェクトを配置するか、単に初期化されていないメモリを自分で割り当てたいですか? – Quentin

答えて

2

未定義の動作は、std::vectorインターフェイスのコントラクトに違反していることに起因します。

はい、メモリが割り当てられているため、メモリアクセス違反は発生しません。

いいえ、初期化されていません。おそらくnew char[N]などを使って作成されているので、後でベクターを構築できる「プレイグラウンド」を提供するのは、未初期化の束です。

不確定な値を読まない限り、問題のない積分型の型です。クラスの型については、コンストラクタが実行されておらず、オブジェクトが存在しないため、問題です。

その場所に手動でオブジェクトを作成してハックすることはできますか?おそらくプレースメントが新しいのでしょうか?確かに。実際には、これがベクターの機能です!しかし、あなたはまだstd::vectorのインターフェースに違反しているでしょう。あなたのプログラムに未定義の振る舞いを埋め込んでいるので、—ブラックボックスの視点から—あなたはボンネットの下でそれをハックしたと思っています。

代わりに、文書化されたインターフェイスを使用してベクトルに追加するだけで、正しくオブジェクトを作成できます。だからそれをやりなさい。

1

新しい演算子を使用すると、整数データ型を使用している場合は、メモリが初期化されません。 char* my_mem = new char[N]などです。このメモリは初期化されず、任意の値を含むことができます。しかし、もしあなたがstd::string my_words = new std::string[N]のようなものを持っていたら。それらはクラスであり、newはデフォルトのコンストラクタを呼び出すため、これらはすべて空の文字列に初期化されます。それは、リザーブ機能がこの動作に従っていると私は想像するだろうと言われています。クラスを予約している場合は、デフォルトのコンストラクターを呼び出し、整数型の場合はそうではありません。

+0

このコンテキストで 'reserve'()がctorsを呼び出さないことを望みます。それはコストがかかるのでコストがかかるでしょう。 (しかし、コンパイル時にそれらの存在を必要とするかもしれません。 –

関連する問題