【问题标题】:_block_type_is_valid(phead- nblockuse) because of delete command_block_type_is_valid(phead- nblockuse) 因为删除命令
【发布时间】:2023-03-07 04:34:01
【问题描述】:
ifstream ifile("Library.dat",ios::in|ios::binary);

Book *book_obj=new Book; //Book is the class name
if(ifile)
 {
    while(ifile.read((char*)book_obj,sizeof(Book)))
     book_obj->Display_BookDetails();
}
ifile.close();

delete book_obj; //Runtime Error is coming here.If I comment out this, then it works fine

我正在从名为 Library.dat 的文件中读取内容。当我执行上述代码时,出现运行时错误访问冲突读取位置 0x004B9B44。注释掉 delete book_obj 效果很好。如何删除 book_obj 以防止内存泄漏。

【问题讨论】:

  • 请告诉我们课程Book。它是否包含任何非 POD 数据成员?
  • 类书 { 私人:字符串 book_Number;字符串书名;字符串 book_Author;字符串 book_Publisher;字符串 book_Edition; int book_Quantity;公共:书();书(字符串,字符串,字符串,字符串,字符串,int); };

标签: c++ visual-studio-2012 memory-leaks runtime-error placement-new


【解决方案1】:

您的班级包含非 POD 成员。您无法将结构读取为字节块而不会遇到问题。您必须通过创建自己的 std::istream& operator>>(std::istream&, Book&) 函数来自行序列化:

std::istream& operator>>(std::istream& is, Book& b)
{
    // extract individually into b's data members
}

现在你可以这样做了:

while (ifile >> book_obj)
{
    book_obj->Display_BookDetails();
}

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2015-02-11
    • 2015-09-22
    相关资源
    最近更新 更多