我正在尝试做一个非常基本的字符串数组,这些字符串可动态增长,以便为某些索引添加新单词。我需要这种基本格式(即不能使用STL中的任何内容)。只需注意几点:我不担心会覆盖旧单词,新字符串数组的未使用索引也可以是空字符串。
我知道我的问题(seg。fault)在我的set函数中,但我不知道它为什么会发生。我正在尝试创建一个具有所需大小的新的,更大的字符串数组,用前面的单词填充它,然后将它分配给我的类字符串数组(在删除旧数据之后),然后将新单词放入新指数。
可能会有更多错误,因此请随意批评任何和/或所有错误。
感谢。
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
class GA
{
public:
GA();
GA(const GA & other);
~GA();
GA & operator=(const GA & rhs);
string get(unsigned index) const;
GA & set(unsigned index, const string & s);
private:
string * word;
int size;
};
void die(const string & msg);
int main()
{
GA w;
w.set(2, "Index Two");
w.set(6, "Index Six");
cout << w.get(2);
cout << endl;
cout << w.get(3);
}
GA::GA()
{
word = NULL;
size = 0;
}
GA::GA(const GA & other)
{
try
{
word = new string[other.size];
}
catch(const bad_alloc &){ die("Alloc. Failure");
}
size = other.size;
for (int i = 0; i < other.size; i++)
word[i] = other.word[i];
}
GA::~GA()
{
delete [] word;
}
GA & GA::operator=(const GA & rhs)
{
if (this != &rhs)
{
delete [] word;
try
{
word = new string[rhs.size];
}
catch(const bad_alloc &)
{
die("Alloc. Failure");
}
for (int i = 0; i < rhs.size; i++)
word[i] = rhs.word[i];
}
return *this;
}
string GA::get(unsigned index) const
{
return word[index];
}
GA & GA::set(unsigned index, const string & s)
{
if (index > size) // need more memory, creating another string array.
{
int newSize = index;
string * newWord = NULL;
try
{
newWord = new string[newSize];
}
catch(const bad_alloc &)
{
die("Alloc. Failure");
}
for (int i = 0; i < newSize; i++)
{
newWord[i] = word[i];
}
delete [] word;
word = newWord;
size = newSize;
}
word[index] = s;
return *this;
}
void die(const string & msg)
{
cerr << "Fatal Error: " << msg << endl;
exit(EXIT_FAILURE);
}
答案 0 :(得分:2)
index > size
应为index >= size
(如果您在索引中一直递增1,则为==
)。
例如,如果您有一个包含5个元素的数组,并且索引为5,那么您将尝试访问该数组的第6个元素。
编辑:此外,您正在分配一个大小等于索引的数组。这意味着您可以再次使用0
和size - 1
之间的索引对其进行索引,而不是 size
。
你可以这样做:
//Check for index being bigger or equal than the size of the array
//as the case of equality leads to an index out of array bounds!
if(index >= size){
//....
//New size must be greater than the index!
int newSize = index + 1;
//....
}