防止char * vector中的最后一个元素发生变化

时间:2010-10-18 21:00:14

标签: c++ pointers vector

我正在使用fread在C ++中读取字符串,我正在阅读并在siteNames_中存储shortSiteText。 siteNames_声明为std::vector<char*> siteNames_;我在其他函数中使用siteNames_但因为shortSiteText是一个指针,当我在其上调用delete命令时,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;

我尝试使用dereference运算符:siteNames_.push_back(*shortSiteText);但是会​​生成编译器错误。

注意:由于遗留代码,我必须使用fread和char *。

3 个答案:

答案 0 :(得分:3)

在关联的delete[]元素完成之前,您无法vector推送到vector的任何内容。

我不清楚这段代码的意图是什么 - 你只是删除最后使用的shortSitetext值,所以这不符合你的想法(试图避免泄漏内存)我认为将newdelete匹配。

删除最后一行代码,并在完成代码后手动清理vector,方法是迭代调用delete[]每个元素,然后clear() vector }}。

或者使用boost::ptr_vector,它会为您自动执行此操作。

或者使用vector<string>,使用C ++ world将遗留的char*代码与现代的非原始指针分离。您可以将const char*直接推送到vector<string>,如下所示:

const char* str;
// init str to the value you wish

vector<string> vec;
vec.push_back(str);

答案 1 :(得分:2)

让我们放大一下:

shortSiteText = new char[shortSiteTextLength];
siteNames_.push_back(shortSiteText);
delete [] shortSiteText;

解释:第二行只是推送指向数组的指针,而不是数组本身。然后第一行解除分配数组,siteNames的最后一个元素仍然指向该数组;当您使用此元素时,这会导致未定义的行为。

黑客:删除delete [] shortSiteText

真正修复:您遇到此问题是因为您尝试自行管理对象所有权。别 !在这里,您可以使用std::string,并且仍然可以使用c_str()成员函数处理遗留代码。

引用我的一位朋友:

  

作为一般规则,如果你是一个   初学者和你的代码包含   单词'char',你有一个错误。

答案 2 :(得分:0)

在您想要从矢量中删除数据之前,请不要删除shortSiteText。

您已经创建了一块内存,设置了数据,并将指针保存在向量中。您删除的内存与vector元素指向的内存相同。

刚删除了delete [] shortSiteText;行。

但是,请确保在完成向量后,小心删除并删除每个指针。