0

私はC++が初めてです。コレクションを「新しくする」とは正確にはどういう意味ですか? 例えば:

UnicodeStringList* tmp = new UnicodeStringList;
// where UnicodeStringList is typedef to std::list<UnicodeString>

何かを「新しく」するときは、必要なサイズを正確に把握する必要がありますよね? 割り当てコンストラクターを使用してオブジェクトをコピーする場合、コンピューターはヒープに割り当てる必要があるメモリの量をどのように知るのでしょうか? 例えば:

*tmp = another_string_list;

another_string_list は、ヒープ メモリ内の新しい UnicodeStringList にコピーされていますが、そのヒープ メモリの大きさを最初に指定したことはありません。そして、コンパイラは another_string_list の大きさを知らないので、ヒープにどれくらいのメモリが入りますか?

私は混乱しており、誰かが私を理解できるように質問を十分に指定したことを願っていますが、よくわかりません。

助けてください

ありがとう、

ジュリアン

4

6 に答える 6

6

要素を追加しても、のサイズはstd::list変わりません。std::vector例がより単純であるため、a を使用しますが、同じ概念が適用さstd::vectorれます。a には配列へのポインターが含まれており、必要に応じて要素を格納するために動的にサイズ変更されます。配列へのポインターは、それが指す配列が変更されても、サイズは変更されません (1 つのポインターのサイズです)。

于 2010-07-16T17:56:39.063 に答える
3

「新規」が行うことは、すべてのメンバー変数を格納するのに十分なスペースを割り当てることだけstd::listです。実行する必要がある可能性のある余分なことはすべてstd::listのビジネスであり、それ自体を処理する必要があります (コンストラクタとデストラクタを介して)。

于 2010-07-16T18:01:58.917 に答える
2

何かを「新しく」するときは、必要なサイズを正確に把握する必要がありますよね?

ではない正確に。少なくとも、あなたが考えている方法ではありません。

もちろんnew、生の配列を使用する場合は、配列内の要素の数を指定する必要があります。しかし、、、std::listなどstd::vectorは生の配列ではありません。

例を挙げるstd::listと、外から見ると、入れたものは何でも入っているものと考えることができます。ただし、詳しくは、ポインターのみを直接含むオブジェクトです。これらのポインターは、ヒープ上に割り当てられた他のオブジェクトを指します ( を使用new)。したがって、それ自体のインスタンスstd::listは常に同じサイズですが、さらに何かを追加すると、それを管理するためにヒープ上の他の場所にさらに多くのものを割り当てることになります。

これはまた、リストをスタック割り当てローカル変数として使用でき、リストにアイテムを何個でも問題なくプッシュできる理由でもあります。

UnicodeStringList MyList;
MyList.push_back(item1);
MyList.push_back(item2);

の必要はありませんnew。リストは、独自の内部 (ヒープが割り当てられた) ブックキーピングを配置して、自分のアイテムとして対応し、それに追加したいと考えています。

したがって、1 つのリスト A がリスト B に割り当てられると、リスト A のすべてのアイテム (および内部で管理される簿記オブジェクト) が新しくヒープに割り当てられたアイテムにコピーされ、リスト B に渡されて管理されます。

于 2010-07-16T21:05:10.730 に答える
1

あなたnewとオブジェクトを作成すると、そのオブジェクトに必要なメモリが初期状態で取得されます。ただし、クラスがその内部状態を処理する方法にかなりの複雑さを実装できることを理解する必要があります。

特にあなたの質問のために、クラス(あなたの場合はa list<>)はそれ自体がその操作の過程で動的にメモリを割り当てて解放することができます。これがlistコレクションの機能です。アイテムがリストに追加されると、そのアイテムにメモリが割り当てられ、通常はポインターまたはスマートポインターオブジェクトを使用して、その新しいアイテムを管理するために必要なハウスキーピングが実行されます。そのため、オブジェクトによって使用されるメモリlist<>は変更される可能性がありますが、「コア」リストオブジェクト自体は、最初に割り当てられたときと同じサイズのままです。

于 2010-07-16T19:15:13.593 に答える
1

何かがどれだけ大きくなるかを実際に知る必要がある唯一の場所は、スタック上です。スタックは、コンパイラを満足させるために非常に静的な方法で成長する必要があります。ただし、ヒープにはそのような制約はありません。

new何かをするときは、ヒープに割り当てます。したがって、任意のサイズにすることができます。コレクションもスタックに割り当てることができるということは、むしろ驚くべきことです。これは、コレクションに含まれるものに関係なく、そのサイズが不変であるためです。むしろ、割り当てのサイズが可変でなければならないヒープへの情報 (ポインターなど) が含まれています。

于 2010-07-16T17:57:58.350 に答える
0

new が何をするのか調べたいと思うかもしれません。スタックメモリではなくヒープメモリに配置します。このようにして、スコープを失ったときにそれがなくなることはありません。既知のサイズとは何の関係もありません。これを配列と混同している可能性があります。配列にメモリを割り当てる場合、サイズを知る必要があり、通常は新しいサイズになります。

于 2010-07-16T17:56:02.450 に答える