就像我在标题中说的那样,我无法让析构函数工作。原因是在这个程序中我需要使用带有负索引的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();
}
答案 0 :(得分:4)
执行此操作的唯一正确方法是在班级上定义自定义operator[]
。您拥有的代码有很多错误:
low
和high
high-low+1
元素。但您只需分配high-low
。p=new int[high-low+1]
,则run=p+low;
和run[low]
表示*(p + low + low)
。这是导致崩溃的直接原因 - 您在数组外部写了一些内容,删除了内部元数据,这使得下一个用户(字符串的赋值运算符)的动态分配失败。low
时,您应该减去run
,以便run[low]
给出p[0]
,这是第一个分配的元素。但这可能会计算数组外的指针(当low
为正数时),这是未定义的行为。delete[]
的指针,该指针不是来自数组new
。您需要将p
而不是run
传递给delete[]
。这是一个更好的版本:
#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)
由于您a
时l
run
加new
,因此必须在delete
时减去它:
delete[] (run - l);
答案 3 :(得分:1)
不要吝啬,但这是非常糟糕的代码。
首先,如果b - a
返回的数字小于0
,您可能会获得std::bad_alloc
以及a
&gt; c
您将进入未定义的行为 [可怕]区域,如果您尝试使用指针,可能会出现段错误。
看到你试图delete[]
指向new int[c] + a
的指针,你几乎肯定会遇到段错误。
在尝试run -= a
之前,您需要执行delete[]
,实现将在您获得的指针之前存储空间中任何new
或malloc
的信息这样,当你delete
或free
内存时,它只需要在指针后面运行并获取它需要的任何信息,或者将信息存储在某个隐藏数组中,该数组由数字表示法索引。指针。但可能是第一个。无论哪种方式,你都在做你正在做的事情。