我正在使用 fread
读取 C++ 中的字符串我在哪里读取和存储 shortSiteText
在 siteNames_. siteNames_ 声明为 std::vector<char*> siteNames_;
我在其他函数中使用 siteNames_ 但因为 shortSiteText
是一个指针,当我对其调用删除命令时, siteNames_
中的最后一个条目被改变了。我该如何防止这种情况发生?
for (unsigned int i = 0; i <= nSites; i ++){
fread((char *) &shortSiteTextLength, 1, sizeof shortSiteTextLength, baseFile_);
shortSiteText = new char[shortSiteTextLength];
fread(shortSiteText,1, shortSiteTextLength,baseFile_);
siteNames_.push_back(shortSiteText);
}
delete [] shortSiteText;
我尝试使用取消引用运算符:siteNames_.push_back(*shortSiteText);
但这会产生编译器错误。
注意:由于遗留代码,我必须使用 fread 和 char*。
最佳答案
你不能delete[]
任何你插入 vector
的东西直到关联vector
元素完成了。
我不清楚这段代码的意图是什么 - 您只是删除 shortSitetext
的最后使用的值无论如何,所以这并不符合您的想法(我认为,这是试图通过将 new
与 delete
匹配来避免内存泄漏)。
删除最后一行代码,并手动清理vector
当您通过迭代调用 delete[]
的元素来完成它时对于每个,然后 clear()
vector
。
或者使用boost::ptr_vector
,它将自动为您执行此操作。
或者使用vector<string>
,解耦遗产char*
使用 C++ 世界的现代非原始指针代码。您可以push_back const char*
直接发送至vector<string>
像这样:
const char* str;
// init str to the value you wish
vector<string> vec;
vec.push_back(str);
关于c++ - 防止 char * vector 中的最后一个元素发生更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3963352/