C++结构异常的清晰向量
C++ clear vector of structs exception
我定义了一个名为 Part 的结构:
struct Part
{
std::string id;
double area;
double volume;
bool operator==(const Part& part) const
{
return (area == part.area) && (volume == part.volume);
}
bool operator!=(const Part& part) const
{
return !operator==(part);
}
bool operator<(const Part &part) const
{
return (area + volume) < part.area + part.volume;
}
};
我创建了一个零件矢量并将矢量保存在二进制文件中。 然后我将二进制文件读入向量。我确认所有零件都已正确读取到矢量中。我读取二进制文件的函数是:
static bool restore_vector_from_file(const char* fileName, std::vector<Part> &parts) {
std::ifstream instream(fileName, std::ios::in | std::ios::binary);
if (!instream) {
return false;
}
instream.seekg(0, instream.end);
int bytes = instream.tellg();
instream.seekg(0, instream.beg);
int vector_size = bytes / sizeof(Part);
parts.resize(vector_size);
instream.read(reinterpret_cast<char*>(parts.data()), bytes);
if (!instream)
{
return false;
}
instream.close();
return true;
}
我的主要功能是:
int main(int argc, char *argv[])
{
if (argc != 3)
{
std::cout << "Number of arguments must be 3" << std::endl;
return 1;
}
// Load parts with properties to a vector
const char* folderName = argv[1];
const char* vectorFileName = argv[2];
std::vector<Part> partArray;
// Load from pre-saved file to save time
if (!restore_vector_from_file(vectorFileName, partArray))
{
std::cout << "Failed to retore vector from file" << std::endl;
return 1;
}
partArray.clear();
return 0;
}
一切正常,直到我尝试清除partArray
.它抛出一个异常:
Exception thrown: read access violation.
_Pnext was 0x1BC586CCB48.
即使我删除了partArray.clear()
,在return 0;
时也会抛出相同的异常
请帮忙。
您的结构Part
不是 POD 类型,也不是微不足道的,因此您无法像现在这样保存或加载它。
以它id
成员为例,std::string
对象通常包含一个指针,该指针是保存的内容。该指针在任何其他进程中都无效。
您需要使用序列化来保存和加载结构。
instream.read(reinterpret_cast<char*>(parts.data()), bytes);
这是一个很大的代码气味和UB。std::string
包含一个指向堆分配字符串(模 SSO)的指针,但是当您尝试reinterpret_cast它的形式文件时(假设您以相同的方式保存它),您只会得到一些垃圾值(因为它现在不指向任何有效的内存位置),因此当std::string
尝试在析构函数中释放它时,它会像您经历过的那样失败。你根本无法在这里做你想做的事情。
我建议你重载结构istream& operator>> (istream& is, Part& p);
。以及ostream的相应<<
。这应该很容易,因为所有Part
字段都已经存在这样的重载。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 施工后立即在向量上调用清晰?
- C++结构异常的清晰向量
- C 中的向量指针的清晰图