C++动态字符串数组
C++ dynamic array of string
我正在学习Objective-C/C中的C++,对于一个虚拟项目,我想从存储在Mac OS X机器上的/usr/share/dict/words
文件中加载单词。
其想法是加载文件并将每个字放入一个数组中,因此我有一个类型为string
的array
。
但是我在使用数组的动态内存(使用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;
}
我能看到的第一件事是:
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所指向的内容。
- 使用 jsoncpp 解析 json 数组字符串
- C++ 对象数组字符串输入在控制台上不起作用
- 插入了 C++ 数组字符串数据,但在显示输出时不显示
- 无法区分 JSON 对象/数组/字符串
- 为什么数组(字符串类型)的大小是 24 字节,带有单个空格元素
- 如何使用数组字符串进行输入验证
- (C++) 打印字符数组字符串的单词时出现问题
- 使用Back_inserter从任何位置的输入字符中使用Back_inserter进行过滤数组字符串
- C 函数反转字符数组字符串
- 如何在 c++ 中创建数组(字符串 [] )的向量
- 如何返回数组字符串的指针
- char数组字符串混淆
- 如何从字符数组字符串中提取空格
- 是否可以将 Bitset<8> 的值复制到数组字符串而不转换它们?
- C++数组字符串函数
- 如何在函数中操作字符数组(字符串)的指针,该指针在C / C ++中作为参数传递
- visual将音频文件存储到数组/字符串流C++中
- c++在char数组(字符串)上将what替换为
- 将数组字符串转换为intger c++(初学者)
- 需要设置数组字符串长度,使其恰好为13