私は読んだCで負の配列インデックスは許可されていますか? 配列のインデックスに負の値を使用できることは興味深いことでした。c++11 でもう一度試してみましたが、unique_ptr
そこでも動作します。もちろん、デリータは元の配列を削除できるものに置き換える必要があります。これは次のようになります。
#include <iostream>
#include <memory>
int main()
{
const int min = -23; // the smaller valid index
const int max = -21; // the highest valid index
const auto deleter = [min](char* p)
{
delete [](p+min);
};
std::unique_ptr<char[],decltype(deleter)> up(new char[max-min+1] - min, deleter);
// this works as expected
up[-23] = 'h'; up[-22] = 'i'; up[-21] = 0;
std::cout << (up.get()-23) << '\n'; // outputs:hi
}
メモリリークが発生する可能性が非常に低いかどうか疑問に思っています。ヒープ上に作成されたメモリのアドレス ( new char[max-min+1]
) に 23 を加算するとオーバーフローし、null ポインタになることがありました。23 を減算しても配列の元のアドレスが得られますが、unique_ptr
はそれをヌル ポインターとして認識する場合があります。nullのunique_ptr
ため、削除できない場合があります。
では、前のコードでメモリ リークが発生する可能性はありますか?それとも、スマート ポインターが安全な方法で動作するのでしょうか?
注: 実際のコードではこれを使用しません。私はそれがどのように振る舞うかに興味があります。