C++动态字符串数组

C++ dynamic array of string

本文关键字:数组 字符串 动态 C++      更新时间:2023-10-16

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

其想法是加载文件并将每个字放入一个数组中,因此我有一个类型为stringarray

但是我在使用数组的动态内存(使用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;
}

我能看到的第一件事是:

placeholderArray[*arrayLength + 1] = newWord;

您正在添加一个超过数组末尾的元素。数组是从0索引的。例如,如果数组长度为5,则数组中的最后一个元素位于索引4处。所以这条线应该是:

placeholderArray[*arrayLength] = newWord;

然后,你删除你的数组与这个:

currentArray = placeholderArray;
delete [] placeholderArray;

由于您只是将currentArray设置为指向占位符数组,然后将其删除。

此外,通过引用传递比通过指针传递要好得多。因此,与其这样:

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

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

currentArray = placeholderArray;

在这里,你可以释放所述指针指向的空间:

delete [] placeholderArray;

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


不要在C++中使用C样式的数组,而是使用std::vector及其resize()函数。更好的是,您的应用程序可以简单地在每个newWord上调用push_back(),这将消除对addWord()函数的全部需求。

currentArray = placeholderArray;

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

delete [] placeholderArray;

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