gpt4 book ai didi

c++ - 离开方法时访问冲突

转载 作者:行者123 更新时间:2023-11-28 06:28:28 25 4
gpt4 key购买 nike

当我离开一个方法时,我正试图弄清楚如何解决我的访问冲突。我从使用唯一 ptr 更改为共享 ptr,所以这可能是 shared_ptr 的一个微妙之处。我无法在线查找有关 shared_ptrs 的信息。我也曾经在下面注释掉一行并且不得不将其更改为使用我的新类而不是使用唯一 ptrs 的对象 vector 。当我取消注释大括号时,它没有访问冲突。

方法如下所示:

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 = ...

然后使用 valgrind或其他工具来检查内存是否实际释放。

关于c++ - 离开方法时访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28112750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com