我无法让我的析构函数在我的代码中工作

I cant get my destructor to work in my code

本文关键字:我的 代码 工作 析构函数      更新时间:2023-10-16

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

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();
}

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

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

这是一个更好的版本:

#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,并且异常安全。

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

你有一个简单的错误:

不要将值传递给不是从new []获得(或已经传递过一次(delete []

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

另外,请注意,如果使用指针算术创建一个指向数组外部的指针,则具有未定义的行为。

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

由于您在new时将a(又名 l (添加到run,因此在delete它时必须减去:

delete[] (run - l);

不是想刻薄,但这是非常糟糕的代码。

首先,如果b - a返回的数字小于0,你可能会得到一个std::bad_alloc,如果a> c,你将进入未定义的行为[可怕]领域,如果你尝试使用指针,可能会得到一个段错误。

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

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

相关文章: