2017-07-28 3 views
-2

新しい配列演算子を削除してもdelete []演算子には触れないでください新しい配列演算子のオーバーロードはどのくらい安全ですか?私はヒープ上に割り当てられ、</p> <ul> <li>新規[]と、私は単にオーバーロードすることができる[]</li> <li>shared_ptrの(新しい[])</li> </ul> <p>を削除するように使用される構造体を使用していると仮定すると

struct alignas(256) MyStruct 
{ 
    Item i1,i2; 
    void * operator new[](unsigned long int size) 
    { 
     return aligned_alloc(256,size); 
    } 

    void * operator new (unsigned long int size) 
    { 
     return aligned_alloc(256,size); 
    } 
}; 

これは漏れなく実行されていますか?

GCC 6.3およびC++ 0x。

+2

なぜあなたは 'delete'と' delete [] 'を指定する必要はないと思いますか? – geza

+0

free()を呼び出していませんか?すべての種類の_alloc_コマンドに対してfree()は十分ですか? –

+0

「それ」とはどういう意味ですか?誰が 'free()'と呼ぶはずですか? – geza

答えて

5

実際には、あなたの標準ライブラリがこれらの機能をどのように実装しているかは保証できません。標準の実装では、malloc()free()にコールスルーできるだけで、必須ではありません。 syscall自体を使って、管理しているメモリオブジェクトをバックアップすることもできます。あるいは、mmap()のシステムコールを使用することもできます。

これら3つのうちのいずれも完全に可能であり、他の2つの実装と互換性がありません。また、悪いことに、標準のoperator delete()実装では、内部簿記を実行するために渡すポインタの前にあるいくつかの隠しデータフィールドを参照することがあります。標準operator delete()に渡されたポインタが実際に一致するポインタoperator new()によって返されたポインタでない場合、未定義の動作が発生します。本当に何かが起こっている可能性は非常に高いです。

実際にはありません。operator new()を指定する場合は、operator delete()も指定する必要があります。そうしないと、すべての地獄が緩んでしまうかもしれません。

1

newをオブジェクトにオーバーロードすると、deleteもオーバーロードする必要があります。同様に、new[]をオーバーロードする場合は、delete[]をオーバーロードする必要があります。これは、オブジェクトがデフォルトのdeleteを使用するため、newでどのように混乱したかに応じてクラッシュする可能性があるためです。

コンパイラによっては、deleteはとにかくfree()を呼ぶかもしれないが、あなたはあなたのオブジェクトが割り当てられます方法を変更する場合は特に、newdeleteの両方をオーバーロードするのが習慣に取得する必要があります。

+1

"と言っています。' delete'は 'free()'と呼んでいます。 – geza

関連する問題