C ++:删除奇怪的行为

时间:2012-03-01 15:51:02

标签: c++ dynamic

我已经开始在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日,这就是为什么它很奇怪

1 个答案:

答案 0 :(得分:3)

delete只能在动态分配的块的开头的地址上正常工作。

cif将失败其中一个或两个条件,导致析构函数调用delete时出现未定义的行为,原因如下:

  • 您将startPos分配给cif,然后在调用placement new之前以非常奇怪的方式对其进行修改。因此,即使startPos是正确分配的动态内存块,cif 也不再指向它的起始地址
  • 如果调用者将基于堆栈的变量的地址传递给startPos,那么根本不再处理动态内存

更不用说你在循环中调用newdelete了 - 这是怎么回事?除非您以非常特定的方式制作输入参数,否则还有很大的机会轰炸内存。这整段代码看起来很可疑,你到底想要做什么?