我不能让我的析构函数在我的代码中工作

时间:2014-10-27 03:12:05

标签: c++

就像我在标题中说的那样,我无法让析构函数工作。原因是在这个程序中我需要使用带有负索引的int *数组:我在运行时也会随机出现此错误:Microsoft C ++异常:std :: bad_alloc在内存位置0x009DF130。 继承了我认为涉及错误的代码:

private: int* run;
IntArray::IntArray(int a, int b)
{
    int c = b-a;
    run = new int [c] + a; //This is how i give it a negative indicie
    h = b;
    l = a;
}
IntArray::~IntArray()
{
    delete[]run;
}
string IntArray::setName(string sp)
{
    s = sp;
    return s;
}
void runSim() {
    IntArray b(-4, 6);
    for (int i = b.low(); i <= b.high(); i++)
    // low is the lowes bound high  is the highest
        b[i] = i * 10;
    b.setName("b"); //this is where it breaks and gives me that error
    wait();
}

4 个答案:

答案 0 :(得分:4)

执行此操作的唯一正确方法是在班级上定义自定义operator[]。您拥有的代码有很多错误:

  1. 您同时访问lowhigh high-low+1元素。但您只需分配high-low
  2. 如果p=new int[high-low+1],则run=p+low;run[low]表示*(p + low + low)。这是导致崩溃的直接原因 - 您在数组外部写了一些内容,删除了内部元数据,这使得下一个用户(字符串的赋值运算符)的动态分配失败。
  3. 在计算low时,您应该减去run,以便run[low]给出p[0],这是第一个分配的元素。但这可能会计算数组外的指针(当low为正数时),这是未定义的行为。
  4. 您传递指向delete[]的指针,该指针不是来自数组new。您需要将p而不是run传递给delete[]
  5. 您没有尝试异常安全。在C ++中管理动态内存是一个高级主题,证据表明你尚未做好准备。因此,使用现有的智能指针来管理你的记忆。
  6. 这是一个更好的版本:

    #include <memory>
    
    template<typename T>
    class ArbBoundArray
    {
        int low;
        std::unique_ptr<T[]> base;
    
    public:
         ArbBoundArray(int l, int h) : low(l), base(new T[h-l+1]) {}
         T& operator[](int o) { return base[o-low]; }
         const T& operator[](int o) const { return base[o-low]; }
    };
    

    就是这样。代码更少,适用于int以外的任何类型,以及异常安全。

    您可以在该基本概念之上添加您的特殊需求,例如名称或其他任何内容。

答案 1 :(得分:3)

你有一个简单的错误:

请勿将值传递给delete [] new [],而不是{{1}}(或已经过一次)。

您需要撤消指针算术以获得正确的指针。

另外,请注意,如果使用指针算法创建指向数组外部的指针,则会出现未定义的行为。

如果这不是您的实际代码,请注意尝试分配少于1个元素。

答案 2 :(得分:1)

由于您al runnew,因此必须在delete时减去它:

delete[] (run - l);

答案 3 :(得分:1)

不要吝啬,但这是非常糟糕的代码。

首先,如果b - a返回的数字小于0,您可能会获得std::bad_alloc以及a&gt; c您将进入未定义的行为 [可怕]区域,如果您尝试使用指针,可能会出现段错误。

看到你试图delete[]指向new int[c] + a的指针,你几乎肯定会遇到段错误。

在尝试run -= a之前,您需要执行delete[],实现将在您获得的指针之前存储空间中任何newmalloc的信息这样,当你deletefree内存时,它只需要在指针后面运行并获取它需要的任何信息,或者将信息存储在某个隐藏数组中,该数组由数字表示法索引。指针。但可能是第一个。无论哪种方式,你都在做你正在做的事情。