我正在学习来自Objective-C / C的C ++,对于虚拟项目,我想加载存储在Mac OS X机器上的/usr/share/dict/words
文件中的单词。
我的想法是加载文件并将每个单词放入一个数组中,因此我的array
类型为string
。
但是我使用new
和delete
在使用我的数组时使用动态内存时遇到了问题。我已经添加了下面的一些代码,如果有人可以提供帮助......
所以我收到了内存错误:
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;
}
答案 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容器,而不是早点而不是以后使用数组。