功能终止时访问冲突 - 为什么会发生这种情况?

时间:2014-04-19 02:39:01

标签: c++ visual-c++

一旦loadInventoryData函数终止,我的程序就会一直以访问冲突错误终止:

CIS2252编程Project.exe中0x0F9BCCC8(msvcp110d.dll)的未处理异常:0xC0000005:访问冲突读取位置0x007DD314。

调用堆栈:

msvcp110d.dll!std::_Container_base12::_Orphan_all() Line 216    C++
CIS2252 Programming Project.exe!std::_String_alloc<0,std::_String_base_types<char,std::allocator<char> > >::_Free_proxy() Line 680  C++
CIS2252 Programming Project.exe!std::_String_alloc<0,std::_String_base_types<char,std::allocator<char> > >::~_String_alloc<0,std::_String_base_types<char,std::allocator<char> > >() Line 656   C++
CIS2252 Programming Project.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() Line 965   C++
CIS2252 Programming Project.exe!loadInventoryData(std::vector<InventoryItem,std::allocator<InventoryItem> > & invMast) Line 220 C++
CIS2252 Programming Project.exe!main() Line 45  C++
CIS2252 Programming Project.exe!__tmainCRTStartup() Line 536    C
CIS2252 Programming Project.exe!mainCRTStartup() Line 377   C

它终止的代码部分是:

void loadInventoryData(vector<InventoryItem> &invMast)
{
    // Loads invmast.dat or creates one if none exists
    fstream invFile;
    invFile.open("invmast.dat", ios::in | ios::binary);
    if (!invFile)
    {
        cerr << "WARNING: Unable to open file invmast.dat, no inventory records loaded!" << endl;
    }
    else
    {
        cout << "File invmast.dat opened successfully." << endl;

        string itemName;
        int itemQuantity;
        double itemPrice;

        while (invFile && !invFile.eof())
        {
            invFile.read(reinterpret_cast<char *>(&itemName), sizeof(itemName));
            invFile.read(reinterpret_cast<char *>(&itemQuantity), sizeof(itemQuantity));
            invFile.read(reinterpret_cast<char *>(&itemPrice), sizeof(itemPrice));
            invMast.emplace_back(itemName, itemQuantity, itemPrice); // Create element using constructor with data loaded into invLoader
        }

    }
}

在我的Main中,在函数调用之前,这些是我的向量声明:

vector <InventoryItem> invMast;
vector <Customer> custMast;
vector <CustRequest> custRequest;

我完全失去了...我会感激任何人都可以做的事情来帮助确定原因。

我使用的是Visual Studio 2012 Professional。

编辑:

感谢大家的帮助。

我发现了一篇关于在二进制文件中使用字符串的非常好的概述: http://www.cplusplus.com/articles/DzywvCM9/

2 个答案:

答案 0 :(得分:5)

您错误地使用了string。在这一行:

invFile.read(reinterpret_cast<char *>(&itemName), sizeof(itemName));

重新解释itemName并在其上使用sizeof是错误的。您不能像string数组一样使用char类型。这应该可以解决:

itemName.reserve(1024);  // or some other size
invFile.read(itemName.c_str(), itemName.capacity());

方法reserve()为您分配一块内存,c_str()为您提供指向字符串的C样式指针,capacity()为您提供内存大小刚刚保留。

不确定这是最好的解决方案,您可能需要char数组。

答案 1 :(得分:1)

此行看起来不对

invFile.read(reinterpret_cast<char *>(&itemName), sizeof(itemName));

sizeof(itemName)使用那种方式不返回字符串的容量,堆栈跟踪也抱怨字符串分配