0

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

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

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

4

2 に答える 2

0

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

于 2012-04-16T14:56:07.333 に答える
0

このコードを説明させてください...

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

これは実際には4行のコードであり、便宜上2行として記述されています。それらを拡張させてください

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

1行目と3行目は簡単に説明でき、どちらもポインターを宣言しています。bufはへのポインタでありcharpはへのポインタsampleです。今、私たちは何であるかを見ることができませんが、それは他の場所で定義されたクラス、または編集された(多かれ少なかれ新しい名前が付けられた)sampleデータ型の一部であると推測できますが、どちらの方法でも、次のように考えることができますリンクするだけのデータ型またはtypedefsampleintstring

2行目は、メモリのブロックを割り当て、それをchar pointer呼び出されたものに割り当てていますbuf。サンプルが2つのintを含むクラスだったとしましょう。これは、(ほとんどのコンパイラでは)8バイト(intあたり4)になることを意味します。そして、 sbufを保持するために取っておかれたメモリのブロックの開始を指しcharます。

4行目は、非常に複雑な場所です。型の新しいオブジェクトを作成し、それに2つを渡して、この新しいオブジェクトのアドレスをポインタに格納するp = new sample(10,20)という単純なケースである場合。の追加は、基本的に、が指すメモリを利用するように指示しています。sampleintp(buf)newbuf

最終的な効果は、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(あなたが生きているならこれに関する情報)

于 2012-04-16T15:07:03.633 に答える