class uid
{
public:
char id[6] = {'0','0','0','0','0','0'};
uid() {}
~uid() {}
inline void recursive(int x)
{
if(':' == id[x])
{
id[x] = '0';
++id[--x];
recursive(x);
}
}
char* operator++()
{
++id[5];
recursive(5);
return id;
}
void write(char* pchar) const
{
for(int i = 0; i < 6; ++i)
pchar[i] = id[i];
}
};
using namespace std;
int main(int argc, char** argv)
{
const int MAX = 5000000;
uid c;
char** arr = new char*[MAX];
//char** it = arr;
//loop 1
for(int i = 0; i < MAX; ++i)
arr[i] = new char[6];
cout << "allocated" << endl;
//loop 2
for(int i = 0; i < MAX; ++i)
{
++c;
c.write(arr[i]);
}
cout << "data written" << endl;
for(int i = 0; i < MAX; ++i)
delete[] arr[i];
cout << "deleting arr" << endl;
delete[] arr;
return 0;
}
当i == 999999时,运行此操作将导致循环2中的seg错误 - 但是,当添加该行时:
char** it = arr;
seg故障消失了 - 有没有人知道为什么会这样?
由于
答案 0 :(得分:3)
一旦超过999,999,您就会写入不属于c
的内存。声明it
会更改内存映射,以至于没有立即的段错误,但代码仍然不正确,任何其他小的更改都可能导致错误。
答案 1 :(得分:1)
以下是如何修复它:
inline void recursive(int x)
{
if(':' == id[x])
{
id[x] = '0';
if (x) { // <-- added this
++id[--x];
recursive(x);
}
}
}
现在溢出将回绕到000000
,而不是在不足以容纳它的空间中创建一个7位数字。