【发布时间】:2012-10-18 11:12:11
【问题描述】:
我阅读了Are negative array indexes allowed in 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 可能不会删除它,因为它为空。
那么,之前的代码是否有可能会泄漏内存,或者智能指针的行为方式是否安全?
注意:我实际上不会在实际代码中使用它;我只是对它的行为方式感兴趣。
【问题讨论】:
标签: c++ memory-leaks c++11 smart-pointers