0

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

这个想法是加载文件并将每个单词放入一个数组中,所以我有一个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;
}
4

3 回答 3

1
currentArray = placeholderArray;

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

delete [] placeholderArray;

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

于 2013-02-19T02:46:52.553 回答
1

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

currentArray = placeholderArray;

在这里,您释放所述指针指向的空间:

delete [] placeholderArray;

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


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

于 2013-02-19T02:47:03.107 回答
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

于 2013-02-19T02:48:39.530 回答