c++ - 防止 char * vector 中的最后一个元素发生更改

标签 c++ pointers vector

我正在使用 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 的最后使用的值无论如何,所以这并不符合您的想法(我认为,这是试图通过将 newdelete 匹配来避免内存泄漏)。

删除最后一行代码,并手动清理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/

相关文章:

c - 嵌套结构和指针

c++ - 为什么 C++ STL vector 在做很多保留时会慢 1000 倍?

c++ - VS2015 和 clang 编译此代码,但 g++ 拒绝它。哪一个是正确的?

c++ - Opengl superbible example compliation errors 源代码 : drawing a triangle

c++ - 估计 C++11 中剩余的时间

c++ - 如何在 C++ 中将 vector 和标量相乘?

vector - Dyalog 中字符串操作的性能

c++ - 从标准 I\O 流读取和写入会导致错误

编译错误 'undeclared identifier'C

c - 分配一个 char **?