我想弄清楚离开方法后如何解决访问冲突。我从使用唯一的ptr更改为共享的ptr,所以也许这是shared_ptrs的精妙之处。我在网上无法找到有关shared_ptrs的信息。我还曾经在下面添加了注释行,不得不将其更改为使用新类,而不是使用唯一ptrs对象的向量。取消注释大括号时,它没有访问冲突。

该方法如下所示:

int ExecuteIt(String& sFileName, String& sInput, String& sOutput)
{
    // make sure we have valid data
    if (sFileName.isEmpty() || sInput.isEmpty() || sOutput.isEmpty())
    {
        return -1;
    }

    int iResult = -1; // error

    CreateDocW(sOutput, sFileName, pWriter, pDeleteWriter);

    CreateDocR(sInput, sFileName, pReader, pDeleteReader);

    //{

    shared_ptr<IFJ> m_spIFJTemp = pReader->vMethodImpl1();

    if (m_spIFJTemp && !m_spIFJTemp->isVectorIfdEmpty())
    {
        //auto RootContainerIter = vDocRootContainers->begin();
        pWriter->vMethodImpl2(m_spIFJTemp);
        //pWriter->vMethodImpl2(move(*RootContainerIter));

        iResult = 0; // Success
    }
    //}
    Cleanup(); //before step into cleanup m_spIFJTemp has shared_ptr {m_spVectorIFD={ size=1 } } [2 strong refs] [make_shared]  std::shared_ptr<IFJ>
        //after cleanup m_spIFJTemp has shared_ptr {m_spVectorIFD={ size=??? } } [1 strong ref] [{_Uses=1 _Weaks=1 }]   std::shared_ptr<IFJ>

    return iResult;  //when I uncomment the extra curly brackets it steps
                         //into a memory _Decref() and has access violation
                         //reading location in _Destroy()
}


清理是这样的:

void Cleanup()
{
    // Cleanup the reader
    if (pDeleteReader != nullptr)
    {
        pDeleteReader();
        pDeleteReader = nullptr;
    }

    // unload the reader
    if (pReaderLibHandle != nullptr)
    {
        dlclose(pReaderLibHandle);
        pReaderLibHandle = nullptr;
    }

    // Cleanup the writer
    if (pDeleteWriter != nullptr)
    {
        pDeleteWriter();
        pDeleteWriter = nullptr;
    }

    // unload the writer
    if (pWriterLibHandle != nullptr)
    {
        dlclose(pWriterLibHandle);
        pWriterLibHandle = nullptr;
    }
}


我在网上找到了此信息accessviolation,但我检查了一下,但未使用new创建任何shared_ptr,并且我一直在尝试在调试器中进行查看,但不确定对shared_ptr的强引用。

如果您有任何有关可能导致这种情况的信息,请告诉我。我将不胜感激。

最佳答案

我不知道pReader指的是哪个类,但我怀疑以下情况:

您将pReader->vMethodImpl1()的结果放入共享指针中。这意味着当您离开方法时,该共享指针将在该指针上调用delete

但是我怀疑不会放弃返回的对象的“所有权”,并在vMethodImpl1()中保留引用,当您调用pReader时,Cleanup被破坏,并且其自身在指针上调用pReader您存储在共享指针中。因此,您尝试破坏该对象两次。

我建议你只用

delete

代替

IFJ* m_spIFJTemp = ...

然后使用shared_ptr<IFJ> m_spIFJTemp = ...或其他工具检查内存是否实际释放。

10-06 01:56