に尋ねたよりも多くのメモリを返す:今、私は何をしたいのかオペレータは、新しい私は、この署名を持っているオペレータ<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
未定義される可能性があります
「新しいchar [10]」が100メガバイトのメモリを返すことを禁止するものは知らない。そのようなものはもちろん、あまり有用ではないでしょう。しかし、C++ではAFAIKを禁止しています。 –
伝統的には、破棄時にサイズが指定されていないため、オブジェクトの前に余分なデータ*を格納することでこれを行います。そして、共通のテクニックです。 Xの余分なバイトを割り当て、最初のXバイトに書き込んだり、Xバイトをバッファに返します。 – Yakk