我正在使用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 *。
答案 0 :(得分:3)
在关联的delete[]
元素完成之前,您无法vector
推送到vector
的任何内容。
我不清楚这段代码的意图是什么 - 你只是删除最后使用的shortSitetext
值,所以这不符合你的想法(试图避免泄漏内存)我认为将new
与delete
匹配。
删除最后一行代码,并在完成代码后手动清理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;
行。
但是,请确保在完成向量后,小心删除并删除每个指针。