簡體   English   中英

訪問沖突讀取位置0x00000014。 使用流

[英]Access violation reading location 0x00000014. Using Streams

所以我有這個ifStream,它可以從文件中讀取所有內容。 我讀了一行以檢查我正在讀的項目的類型。然后,在我讀完那行之后,我將流傳遞給另一個類,該類又讀了更多的類,但是當到達該類時,它將引發此異常。 訪問沖突讀取位置0x00000014。 這是顯示此錯誤的代碼。

void Author::readData(ifstream & stream1)
{
    string line = "";
    getline(stream1, name); //The error happens here
    if (stream1.fail() && stream1.eof())
    {
        throw Error(-1);
    }
    else if (stream1.fail() && !(stream1.eof()))
    {
        throw Error(0);
    }
    getline(stream1, address);
    if (stream1.fail() && stream1.eof())
    {
        throw Error(-1);
    }
    else if (stream1.fail() && !(stream1.eof()))
    {
        throw Error(0);
    }
}

void Book::readData(ifstream & stream1)
{   

    (*theAuthor).readData(stream1); //This is where the function is called. Let me check to see if It is even initialized here.
    if (stream1.fail() && stream1.eof())
    {
        throw Error(-1);
    }
    else if (stream1.fail() && !(stream1.eof()))
    {
        throw Error(0);
    }
    getline(stream1, title);
    if (stream1.fail() && stream1.eof())
    {
        throw Error(-1);
    }
    else if (stream1.fail() && !(stream1.eof()))
    {
        throw Error(0);
    }

我已經在許多不同的網站上進行了研究,但似乎找不到任何能解釋為什么ifstream拋出此異常的原因。 請幫忙。

編輯:添加了更多代碼,希望對您有所幫助。

顯示的代碼沒有任何問題。

您所閱讀的所有這些網站並沒有完全向您解釋,僅僅是因為C ++程序在特定行上崩潰並不意味着該漏洞所在。 我可以很容易地提出一個最小的示例,即strcpy()超出數組末尾,破壞堆棧,然后繼續執行大量工作,並且只有在嘗試從函數返回時才崩潰。 C ++中的return語句沒有任何問題,但是此時代碼將崩潰。

您的getline()調用或使用方式沒有任何問題。

編程錯誤或錯誤通常會導致內存損壞,但是在對內存進行遍歷之后,代碼可能不會立即以任何有意義的方式嘗試使用它,而是繼續使用它。 稍后在某個指針處,程序將返回並嘗試使用其數據結構,遇到垃圾並崩潰。

最可能的解釋是,較早發生的一個錯誤最終導致遍歷您的std::ifstream和/或名稱std::string 現在,您可以調用getline()從流中讀取到此字符串中,並且代碼崩潰了。 或者,也許是某個東西弄亂了指向此Author類實例的指針。 試圖執行此類方法。 代碼之所以炸毀是因為name類成員顯然是完全垃圾。 該錯誤當然不會在這里,但是只要指向該Author類的指針搞砸了。

獲得問題幫助的唯一方法是發布一個最小,完整且可驗證的示例 ,任何人都可以編譯,執行和重現您的錯誤(注意“最小”要求,這並不意味着您可以發布整個代碼)。

您將需要研究整個程序的其余部分,以查找錯誤。 歡迎使用C ++。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM