delete
配列の最初の要素を超えて要素の割り当てを解除しますか?
char *s = new char[n];
delete s;
上記の場合、のすべての要素が連続して割り当てられていることを確認することは重要であり、配列の一部のみs
に割り当てられるべきではありませんか?delete
より複雑なタイプの場合delete
、最初のオブジェクトを超えてオブジェクトのデストラクタを呼び出しますか?
Object *p = new Object[n];
delete p;
最初の数を超えるsの数をどのようdelete[]
に推測できObject
ますか?これは、割り当てられたメモリ領域のサイズを認識している必要があるという意味ではありませんか?パフォーマンス上の理由でメモリ領域にオーバーハングが割り当てられた場合はどうなりますか?たとえば、すべてのアロケータが1バイトの粒度を提供するわけではないと想定できます。その場合、特定の割り当ては、要素全体またはそれ以上、各要素に必要なサイズを超える可能性があります。
、などのプリミティブ型の場合、次の間にchar
違いint
はありますか。
int *p = new int[n];
delete p;
delete[] p;
free p;
delete
->free
割り当て解除機構を介してそれぞれの呼び出しがたどるルートを除いて?