C ++动态字符串数组

时间:2013-02-19 02:40:35

标签: c++ arrays string

我正在学习来自Objective-C / C的C ++,对于虚拟项目,我想加载存储在Mac OS X机器上的/usr/share/dict/words文件中的单词。

我的想法是加载文件并将每个单词放入一个数组中,因此我的array类型为string

但是我使用newdelete在使用我的数组时使用动态内存时遇到了问题。我已经添加了下面的一些代码,如果有人可以提供帮助......

所以我收到了内存错误:

word:: A
word:: a
word:: aa
word:: aal
definitions(2758) malloc: *** error for object 0x100103b90: incorrect 
checksum for freed object - object was 
probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

加载字词:

string* Definition::loadWords()
{
    int arrayLength = 0;

    arrayOfWords = new string[arrayLength];

    ifstream file;

    file.open("/usr/share/dict/words");

    if(file.is_open())
    {
        while(file.good()){
            string word;
            getline( file, word );
            this->addWord(word, arrayOfWords, &arrayLength);
        }

    }

    file.close();

    cout << endl << "There are " << arrayLength << " words" << endl;

    return arrayOfWords;
};

向数组添加单词:

void Definition::addWord(string newWord, string currentArray[], int* arrayLength)
{
    cout << endl << "word:: " << newWord;

    string *placeholderArray = new string[*arrayLength + 1];
    placeholderArray[*arrayLength + 1] = newWord;

    for(int i = 0; i < *arrayLength; i++){
        placeholderArray[i] = currentArray[i];
    }

    (*arrayLength)++;

    currentArray = placeholderArray;

    delete [] placeholderArray;
}

3 个答案:

答案 0 :(得分:1)

currentArray = placeholderArray;

将placeholderArray别名为currentArray。所以,当你打电话......

delete [] placeholderArray;

..您正在删除currentArray指向的内容。

答案 1 :(得分:1)

这里只是分配指针,而不是数组中的值:

currentArray = placeholderArray;

在这里你释放了指针指向的空间:

delete [] placeholderArray;

下次从释放的内存空间读取时,将导致未定义的行为。


使用std::vector及其resize()函数,而不是在C ++中使用C风格的数组。更好的是,您的应用程序可以在每个push_back()上调用newWord,这样可以避免对addWord()函数的全部需求。

答案 2 :(得分:1)

我能看到的第一件事是:

placeholderArray[*arrayLength + 1] = newWord;

您要在数组末尾添加元素。数组的索引编号为0.例如,如果数组长度为5,则数组中的最后一个元素位于索引4.因此该行应为:

placeholderArray[*arrayLength] = newWord;

然后你用这个删除你的数组:

currentArray = placeholderArray;

delete [] placeholderArray;

因为您只是将currentArray设置为指向placeholderArray然后将其删除。

通过引用传递比通过指针传递要好得多。所以不是这样:

void Definition::addWord(string newWord, string currentArray[], int* arrayLength)

使用此:

void Definition::addWord(string newWord, string currentArray[], int& arrayLength)

每次要使用它时,并不总是必须使用*来获取值。

这是一个使用引用的教程: http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

同时节省时间和精力,学会使用矢量和stl容器,而不是早点而不是以后使用数组。

这是使用向量的教程: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4027/C-Tutorial-A-Beginners-Guide-to-stdvector-Part-1.htm