我无法让我的析构函数在我的代码中工作
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[]
。 - 您没有尝试异常安全。 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
,该实现将存储有关任何new
或malloc
的信息,以便在您获得的指针之前的空间中存储有关任何或的信息,以便当您delete
或free
内存时,它只需要在指针后面运行并获取所需的任何信息,或者将信息存储在由数字索引的隐藏数组中指针的表示形式。但可能是第一个。无论哪种方式,你都在做你正在做的事情。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么我的代码在输出中增加了93天
- 0-1背包代码中的错误.我的代码中有什么错误
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 在我的代码中,获得最大的Pair Wise产品C++和输出并不总是正确的
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 我的代码运行良好,但在游戏循环中中断
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 我的代码中的意外价值以及我如何修复它
- 为什么 rand 不在我的代码中生成随机数?
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 如何改进我的代码,使其不会因超时而终止?(黑客排名挑战)
- 无法找出我的代码中的内存泄漏
- 我不明白为什么我的代码不起作用并且需要更长的时间来运行
- 我正在尝试创建一个菜单,但我的代码一直在循环