C++ C++;-将动态数组强制转换为垃圾
我正在尝试为动态调整大小的sequence类创建一个实现文件。这是一个家庭作业,根据作业的局限性,我只允许弄乱我写的实现文件 问题是,当我创建动态数组时,它似乎是垃圾,没有实际值,而且根本不像数组。当我在调试器中查看它时,我经常会得到一个类似-6.2774385622041925e+066的值(更新:这在某种程度上是由Anders K.的catch解决的,尽管当我现在在调试器中查看时,我得到的是1个普通数字,而不是我应该得到的整个数组,输出显示第一个之后的任何元素仍然是一个疯狂的奇怪数字)。另外,在某一点之后,程序停止运行并抱怨堆已损坏,我怀疑这与显示为不稳定值的数组直接相关 非常感谢您的帮助。我不是在寻找一个彻底的解决方案,但我一定是在哪里做错了什么,惹得我大发雷霆。就像我说的,我只写了实现文件,所以它当然可能是错的 更新:粘贴新的和清理过的代码版本,这样其他愚蠢的错误就不会妨碍大错误 这是我的实现文件(我唯一可以更改的文件)sequence.cpp:C++ C++;-将动态数组强制转换为垃圾,c++,C++,我正在尝试为动态调整大小的sequence类创建一个实现文件。这是一个家庭作业,根据作业的局限性,我只允许弄乱我写的实现文件 问题是,当我创建动态数组时,它似乎是垃圾,没有实际值,而且根本不像数组。当我在调试器中查看它时,我经常会得到一个类似-6.2774385622041925e+066的值(更新:这在某种程度上是由Anders K.的catch解决的,尽管当我现在在调试器中查看时,我得到的是1个普通数字,而不是我应该得到的整个数组,输出显示第一个之后的任何元素仍然是一个疯狂的奇怪数字)。另外
#include "sequence.h"
using namespace main_savitch_4;
typedef double value_type;
typedef std::size_t size_type;
sequence::sequence(size_type initial_capacity){
data = new value_type[initial_capacity];
used = 0;
current_index = initial_capacity + 1;
capacity = initial_capacity;
}
sequence::sequence(const sequence& source){
capacity = source.size();
used = capacity;
current_index = capacity + 1;
data = new value_type[capacity];
for (int i = 0; i < used; i++)
data[i] = source.data[i];
}
sequence::~sequence(){
delete [] data;
}
void sequence::resize(size_type new_capacity){
if (new_capacity > used){
value_type *temp = new value_type[new_capacity];
for(int i = 0; i < used; i++)
temp[i] = data[i];
value_type *destroyme = data;
data = temp;
delete [ ] destroyme;
capacity = new_capacity;
}
}
void sequence::start( ){
current_index = 0;
}
void sequence::advance( ){
current_index += 1;
}
void sequence::insert(const value_type& entry){
if (used + 1 > capacity){
resize(capacity + 5);
}
value_type *temp = new value_type[capacity];
int i(0);
if (is_item()){
for(i=i; i < current_index; i++)
temp[i] = data[i];
temp[i] = entry;
current_index = i;
i++;
for(i=i; i < used; i++)
temp[i] = data[i];
value_type *destroyme = data;
data = temp;
delete [ ] destroyme;
}
else{
for(int i = used; i > 0; i--)
data[i] = data[i - 1];
data[0] = entry;
current_index = 0;
}
used += 1;
}
void sequence::attach(const value_type& entry){
if (used + 1 > capacity){
resize(capacity + 5);
}
value_type *temp = new value_type[capacity];
if (is_item()){
int i(0);
for(i; i <= current_index + 1; i++)
temp[i] = data[i];
temp[i] = entry;
current_index = i;
for(i; i <= used; i++)
temp[i] = data[i];
value_type *destroyme = data;
data = temp;
delete [ ] destroyme;
}
else{
data[used] = entry;
current_index = used;
}
used+= 1;
}
void sequence::remove_current(){
for(int i = current_index; i < used; i++)
data[i] = data[i + 1];
used = used - 1;
}
void sequence::operator=(const sequence& source){
capacity = source.size();
used = capacity;
current_index = capacity + 1;
data = new value_type[capacity];
for (int i = 0; i < used; i++)
data[i] = source.data[i];
}
size_type sequence::size() const{
return used;
}
bool sequence::is_item() const{
if (current_index < used)
return true;
else
return false;
}
value_type sequence::current() const{
return data[current_index];
}
一个问题:
在初始化过程中,您应该初始化所有ITEN
sequence::sequence(size_type initial_capacity){
data = new value_type[initial_capacity];
used = 0;
current_index = initial_capacity + 1;
capacity = initial_capacity;
}
为什么在最后一项上设置当前的_索引?
此外,当前的_指数应为初始_容量减去1。C开始计算零。一个问题:
在初始化过程中,您应该初始化所有ITEN
sequence::sequence(size_type initial_capacity){
data = new value_type[initial_capacity];
used = 0;
current_index = initial_capacity + 1;
capacity = initial_capacity;
}
为什么在最后一项上设置当前的_索引?
此外,当前的_指数应为初始_容量减去1。C开始计算零。此代码段看起来有点可疑(插入): 我认为你应该做的是在你的方法中添加断言
以确保这些值是您期望的值。此代码段看起来有点不可靠(插入): 我认为你应该做的是在你的方法中添加断言
确保值符合您的预期。我相信我已经处理了所有四个数据成员。我错过了什么?当前_索引要求能够根据项目指南不选择任何内容。它多次使用is_item函数检查此项。我决定不选择它的方式是让它的值大于使用的值。这就是为什么它是current_index+1。我相信我已经处理了所有四个数据成员。我错过了什么?当前_索引要求能够根据项目指南不选择任何内容。它多次使用is_item函数检查此项。我决定不选择它的方式是让它的值大于使用的值。这就是为什么当前索引+1只有在当前索引已用完的情况下,代码段才会变为活动的原因。在这种情况下,根据分配,需要在序列的开头插入。我能想到的唯一方法是,在不创建一个全新阵列的情况下,从最后开始将所有内容向下移动一个位置,然后覆盖阵列中的第一个项目。我相信这就是我在那里所做的。接得好。我必须把你的答案读两遍才能理解这个。哎呀!好吧,你应该是我。多么愚蠢的错误!修复这个问题修复了疯狂的数字问题,但是我仍然在测试4的同一点上得到一个堆错误。只有当当前的_索引已经运行时,这个代码段才会变为活动的。在这种情况下,根据赋值,需要在序列的开始插入。我能想到的唯一方法是,在不创建一个全新阵列的情况下,从最后开始将所有内容向下移动一个位置,然后覆盖阵列中的第一个项目。我相信这就是我在那里所做的。接得好。我必须把你的答案读两遍才能理解这个。哎呀!好吧,你应该是我。多么愚蠢的错误!修复了这个问题,修复了疯狂的数字问题,但是在测试4的同一个位置上仍然出现堆错误。
sequence::sequence(size_type initial_capacity){
data = new value_type[initial_capacity];
used = 0;
current_index = initial_capacity + 1;
capacity = initial_capacity;
}
for(int i = used; i > 0; i--)
data[used] = data[i - 1];