[英]I cant get my destructor to work in my code
就像我在标题中说的那样,我无法让析构函数工作。 原因是,在此程序中,我需要使用带有负索引的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[]
。 您的代码有很多错误:
low
和high
,即high-low+1
元素。 但是您只分配high-low
。 p=new int[high-low+1]
,则run=p+low;
并且run[low]
表示*(p + low + low)
。 这是导致崩溃的最直接原因-您在数组之外进行了编写,浪费了内部元数据,这使下一个用户(字符串的赋值运算符)的动态分配失败。 run
时减去low
,以便run[low]
会给p[0]
(第一个分配的元素)。 但这可能会在数组外部(当low
为正时)计算指针,这是未定义的行为。 new
数组的delete[]
。 您需要传递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
,而且适用于任何类型,并且适用于异常安全。
您可以在基本概念的基础上添加名称或其他特殊要求。
您有一个简单的错误:
不要传递一个值来delete []
不是从new []
(或已经传递一次)中delete []
。
您需要撤消指针算法以获取正确的指针。
另外,请注意,如果使用指针算术创建指向数组外部的指针,则将具有未定义行为。
如果这不是您的实际代码,请当心不要分配少于1个元素。
既然你添加a
(又名l
)来run
,当你new
,你必须在你减去delete
它:
delete[] (run - l);
并不是要刻薄,但这是非常糟糕的代码。
首先,如果b - a
返回小于0
的数字,则可能会得到std::bad_alloc
;如果a
> c
您将进入未定义的行为 [可怕]领域,如果尝试使用,可能会出现段错误指针。
似乎您似乎试图delete[]
指向new int[c] + a
的指针,您几乎肯定会遇到段错误。
您需要先run -= a
然后再尝试delete[]
它,该实现将在您获得的指针之前的空间中存储有关任何new
或malloc
信息,以便在delete
或free
内存时,它只需要在指针后面运行并获取所需的任何信息,或将信息存储在由指针的数字表示形式索引的隐藏数组中。 但可能是第一个。 无论哪种方式,您都在做自己在做的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.