C ++:可动态增长的字符串数组(获得分段错误)

时间:2014-12-18 00:54:28

标签: arrays string segmentation-fault dynamic-allocation

我正在尝试做一个非常基本的字符串数组,这些字符串可动态增长,以便为某些索引添加新单词。我需要这种基本格式(即不能使用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);
}

1 个答案:

答案 0 :(得分:2)

index > size应为index >= size(如果您在索引中一直递增1,则为==)。 例如,如果您有一个包含5个元素的数组,并且索引为5,那么您将尝试访问该数组的第6个元素。

编辑:此外,您正在分配一个大小等于索引的数组。这意味着您可以再次使用0size - 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;
  //....
}