2012-04-10 9 views
0

どのように私は固定場所で新しいを使用してメモリを割り当てるのですか?私の本はこう言っています:どのようにして所定の場所にメモリを割り当てますか?

char *buf=new char[sizeof(sample)]; 
sample *p=new(buf)sample(10,20); 

ここで、newはbufのアドレスにメモリを割り当て、(10,20)は渡される値です。しかし、サンプルは何ですか?それはアドレスかデータ型ですか?

+1

@thecoshmanよく私はstackoverflow.comに新しいので、心配して今すぐに留意し、より多くの回答を受け入れる – Nirvan

答えて

0

は、私はこれは本当にあなたの便宜のために2と書かれたコードの4行、ある

char *buf=new char[sizeof(sample)]; 
sample *p=new(buf)sample(10,20); 

...あなたにこのコードを説明しましょう。

char *buf;      // 1 
buf = new char[sizeof(sample)]; // 2 
sample *p;      // 3 
p = new(buf)sample(10,20);  // 4 

1行目と3行は説明が簡単で、両方ともポインタを宣言しています。 bufcharへのポインタであり、psampleへのポインタです。さて、sampleが何であるかわかりませんが、それ以外のクラスが定義されているか、またはtypedef(多かれ少なかれ新しい名前が付けられています)でもどちらかのデータ型のいずれかであると推測できますが、どちらでもsampleただメモリのブロックを割り当て、私たちのchar pointerbufと呼ばれるそれを割り当てている2行目intまたはstring

をリンクデータ型として考えること。サンプルは2つのintを含むクラスで、これは(ほとんどのコンパイラの下では)8バイト(intごとに4)になることを意味します。そして、bufは、charを保持するために確保されたメモリブロックの先頭を指しています。

4行目は大きな複合体を取得します。 p = new sample(10,20)の場合は、タイプsampleの新しいオブジェクトを作成し、2つのintを渡して、この新しいオブジェクトのアドレスをポインタpに格納する単純なケースになります。 (buf)を追加すると、基本的にnewには、bufが指すメモリを使用するように指示されます。

最終的な効果は、1つのメモリブロック(多かれ少なかれ8バイト)が割り当てられており、2つのポインタがそれを指していることです。ポイントの1つ、bufは、そのメモリを8文字で見ていて、それ以外のものはpで、単一のものはsampleです。

なぜこれを行うとしますか?

通常、そうはなりません。現代のC++はnewの訴訟をかなり冗長にしました。オブジェクトを扱う多くのより良い方法があります。私は、この方法を使用する主な理由は、何らかの理由でメモリのプールを確保したい場合です。大きなブロックのメモリを取得するには時間がかかるため、時間を節約できる可能性があります。あなたはこのような何かをする必要があると思うならば、あなたは

ビットエクストラ間違ったことを解決しようとしている私が埋め込まれたと多くの経験を持っていないほとんどの部分について

、または私はこれを見たことがない。

投稿したコードは基本的には同じことですsample *p = new sample(10,20)どちらの方法もsampleオブジェクトが作成されている場所を制御していません。

また、newを使用してオブジェクトを動的に作成する必要はないと考えてください。

void myFunction(){ 
    sample p = sample(10,20); 
} 

これは自動的にsampleオブジェクトを作成します。このメソッドは、読みやすく理解しやすく、オブジェクトの削除を心配する必要がないため、関数が返されたときにクリーンアップされるので、はるかに望ましい方法です。

あなたは本当にunique_ptr<sample>このようなものは、(あなたの動的なオブジェクトの作成を使用する能力を与えるが、タイプsampleのオブジェクトを削除するあなたのマニュアルの手間を節約する、スマートポインタの使用を考慮し、動的なオブジェクトを利用するために必要がある場合私はあなたの人生はこれについての詳細に向かって指すことができます)

+0

私の本は、モバイルデバイスやその他の組み込みシステム向けのプログラミング環境の配列には、配置の新しい割り当てが必要だと言っています。この本はYahsavant Kanetkarの "Let us C++"です。 – Nirvan

+0

私は言いたいことがあるので、あなたの答えを更新する – thecoshman

0

これはデータ型またはtypedefです。

+0

それは私が意味するものではありません。サンプルはクラスですが、私が求めていたのは、最後の行の "サンプル"です。 – Nirvan

+0

@Nirvan:最後の行に 'sample'の2番目の出現を意味しました。私はあなたが最初のことを意味していると思った –

関連する問題