出现此类错误的可能原因是什么?写入的文件创建没有问题,但fwrite
每次都失败。
我正在从32位小端移植到64位大端。
我写的结构是
struct Node
{
uint8_t *a;
uint32_t *b;
uint32_t c;
uint32_t d;
uint32_t e;
uint32_t f;
uint32_t g;
uint16_t h;
uint8_t i;
uint8_t j;
uint8_t k[MAX];
uint32_t (*l)[2];
uint32_t m;
uint32_t n;
Node() {
memset(this, 0, sizeof(*this));
l = NULL;
a = (uint8_t*)calloc(N,1);
}
~Node() {
free(a);
free(b);
}
};
编写节点的代码是
void push(void *ptr)
{
Node *node = (Node *) ptr;
assert(fwrite(node, sizeof(Node), 1, fpw) == 1);
free(node);
}
fpw
具有全球范围。
当我尝试调试时,我发现fwrite
返回0而perror
给出“错误地址”作为错误。
任何建议都将不胜感激。
答案 0 :(得分:1)
我不确定我在这里有答案,但我认为值得指出我在你的代码中看到的一些东西。我希望,解决这些问题会帮助你克服你的问题。
当您有一个要转储到文件中的类时 - 让该类为您完成工作。这意味着,您的Node
课程将设置write
/ read
,或operator<<
/ operator>>
或您将调用的任何其他常规例程,并将它自身序列化为一个文件,然后从读取的文件中反序列化自身。 Boost也为您tools提供帮助。
转储类指针的内容是一件危险的事情,尤其是如果你在一个架构上转储,在另一个架构上读取(在你的情况下是32LE vs 64BE)。它会以各种不可预测的方式肯定失败。
您可以访问从某处获得的指针而不验证其有效性。在致电ptr
之前,我不知道您是否对push
进行了测试,但我确信在push
本身检查指针会有所帮助,尤其是错误表明它可能不太好。
您正在编写C ++代码。你正在摧毁一个班级。 free
不应该在您的代码中的任何位置!您是否使用Node* node
创建了malloc
?我希望不会!如果您使用new
,必须使用delete
。
您可以在a
中释放b
和~Node
,但不会将它们分配到任何地方。如果你没有在构造函数中分配它 - 当你在析构函数中删除它 - 验证你分配它们时,否则你也会在这里获得一堆未定义的行为。
只是有些事情不禁让人注意,希望有所帮助。