2016-07-30 5 views
2

に尋ねたよりも多くのメモリを返す:今、私は何をしたいのかオペレータは、新しい私は、この署名を持っているオペレータ<code>new</code>を上書きしたい

struct MemoryManager 
{ 
    virtual void* Allocate(size_t bytes) = 0; 
    virtual void Deallocate(void* ptr) = 0; 
}; 

void* operator new(size_t bytes, MemoryManager* man); 

をし、クラスMemoryManagerはこのようになりますオーバーロードされたnew関数が、要求されたよりも多くのメモリを割り当てています。最後の数バイトでMemoryManagerオブジェクトへのポインタが格納されるので、私のカスタムdeleteオペレータで使用する関数を知ることができます。だから、このような何かを割り当てるように見えるでしょう:

__________ 
|   | _ 
|__________| | 
|   | | 
|__________| | 
|   | | <---- Bytes requested for object 
|__________| | 
|   | | 
|__________| | 
|   | _| 
|__________| 
|   | _ 
|__________| | <---- Pointer to MemoryManager 
|   | _| 
|__________| 

私の本物の質問は、この結果は未定義の動作ですか?問題がある可能性がいくつかの点:

  • それはあなたが、アライメントの問題に遭遇するかもしれない(しかし、それらはおそらく克服することができる)
  • を要求したよりも多くのバイトを返すためにnew未定義される可能性があります
+5

「新しいchar [10]」が100メガバイトのメモリを返すことを禁止するものは知らない。そのようなものはもちろん、あまり有用ではないでしょう。しかし、C++ではAFAIKを禁止しています。 –

+3

伝統的には、破棄時にサイズが指定されていないため、オブジェクトの前に余分なデータ*を格納することでこれを行います。そして、共通のテクニックです。 Xの余分なバイトを割り当て、最初のXバイトに書き込んだり、Xバイトをバッファに返します。 – Yakk

答えて

9

この種類はかなり一般的です。ただし、通常は余分なデータを最後ではなく開始時に保存します(プラットフォームの最大アラインメント、つまりパディングが必要な場合があります)。あなたが提案していることを禁止する言語には何もありません。 [basic.stc.dynamic.allocation]から

4

割り当て機能は、ストレージの要求量を割り当てよう。成功した場合は、少なくともブロックサイズがのである記憶ブロックの開始アドレスを返すものとする。

強調が追加されました。したがって、標準では、有効なストレージ領域には厳密に要求されるよりも多くの領域があることが許可されています。

関連する問題