我读了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 时可能会溢出并成为空指针。减去 23 仍会产生数组的原始地址,但unique_ptr
可能会将其识别为空指针。可能不会删除它,unique_ptr
因为它为空。
那么,之前的代码是否有可能泄漏内存,或者智能指针的行为方式是否安全?
注意:我实际上不会在实际代码中使用它;我只是对它的行为方式感兴趣。