我已经开始在C ++中使用动态分配做一些事情,但我遇到了一些问题。这是代码:
nrMare(char cifS[], char* startPos = new char())
{
n = 0;
int i;
cif = startPos;
printf("%p %i\n", cif, (cif - (char*)NULL) % 8);
for(i = strlen(cifS) - 1; i >= 0; i--)
{
cif--;
n++;
cif = new(cif) char(cifS[i] - '0');
}
}
~nrMare()
{
int i;
for(i = 0; i < n; i++)
{
delete(cif);
cif++;
}
n = 0;
cif = 0;
}
nrMare是一个类(它来自罗马尼亚语中的bigNumber:D),它应该能够包含大数字的数字。
问题是析构函数(~nrMare)给出了一个奇怪的错误,当我在我的计算机上创建一个变量nrMare something()时,它适用于116位长的。
你有任何建议或解释吗?
编辑:cif是(char *)类型
编辑#2:n是数字的长度。我这样使用char指针因为我想能够添加(比如n ++; cif--; cif = new(cif)char(number_to_add); - &gt;这会在cif的左边添加number_to_add)并绘制来自双方的元素。
编辑#3:这将是一个很长的...很抱歉这是一个如此糟糕的解释者,感谢你的耐心。有一些运营商:
void operator-=(nrMare nr2)
{
int i;
for(i = 1; i <= n && i <= nr2.n; i++)
cif[n - i] -= nr2[nr2.n - i];
for(i = n - 1; i >= 0; i--)
{
if(cif[i] < 0)
{
cif[i] += 10;
cif[i - 1]--;
}
}
while(cif[0] == 0)
{
cif++;
n--;
//delete(cif - 1);
}
}
int operator/=(int nr)
{
int i;
for(i = 0; i < n - 1; i++)
{
cif[i + 1] += (cif[i] % nr) * 10;
cif[i] = cif[i] / nr;
}
i = cif[n - 1] % nr;
cif[n - 1] /= nr;
while(cif[0] == 0)
{
cif++;
n--;
//delete(cif - 1);
}
return i; // the return value is this big number % nr
}
void operator*=(int cifTimes)
{
int i;
for(i = 0; i < n; i++)
{
cif[i] *= cifTimes;
}
for(i = n - 1; i >= 0; i--)
{
if(cif[i] > 9)
{
if(i != 0)
{
cif[i - 1]++;
cif[i] %= 10;
}
else
{
n++;
cif[0] %= 10;
cif--;
cif = new(cif) char(cif[0] = 1);
}
}
}
}
编辑#4:n =数字的长度=位数=字节数。奇怪的错误意味着它只是崩溃。我不知道如何找到更多相关信息。 MinGW编译器要求Visual Studio(Visual C ++)调试它,因为它有一些问题。这是一个问题,在某处(在评估者中)它说“被信号6(SIGABRT)杀死”,如果这有帮助。
编辑#...:@Branko Dimitrijevic:我不想懒惰......我想要自己......我有更多的尝试让这个问题在运行。如果我拿出析构函数,它就可以正常工作了,我想那时它会是一个内存泄漏......我真的想知道为什么会发生这种情况......并且只针对特定的大小,即它不会在第一次“删除”时崩溃,但在我的情况下,在11日,这就是为什么它很奇怪。答案 0 :(得分:3)
delete
只能在动态分配的块的开头的地址上正常工作。
cif
将失败其中一个或两个条件,导致析构函数调用delete
时出现未定义的行为,原因如下:
startPos
分配给cif
,然后在调用placement new之前以非常奇怪的方式对其进行修改。因此,即使startPos
是正确分配的动态内存块,cif
也不再指向它的起始地址。startPos
,那么根本不再处理动态内存。更不用说你在循环中调用new
和delete
了 - 这是怎么回事?除非您以非常特定的方式制作输入参数,否则还有很大的机会轰炸内存。这整段代码看起来很可疑,你到底想要做什么?