离开时访问违规方法
Access violation when leave method
我正在尝试弄清楚如何在离开方法时解决我的访问冲突。我从使用唯一的 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;
}
}
我在网上发现了这个信息访问违规,但我检查了,我没有用新的创建任何shared_ptr,我一直在尝试在调试器中查看它,但我不确定shared_ptr的强引用。
如果您对可能导致此问题的原因有任何意见,请告诉我。 我将不胜感激任何有用的答复。
我不知道
pReader
指的是哪个类,但我怀疑以下内容:
将pReader->vMethodImpl1()
的结果放入共享指针中。这意味着当您离开该方法时,此共享指针将在该指针上调用delete
。
但是,我怀疑vMethodImpl1()
不会放弃返回对象的"所有权",并将引用保留在pReader
内,当您调用Cleanup
时,pReader
被破坏并自行调用delete
存储在共享指针中的指针。因此,您尝试破坏该对象两次。
我建议你只使用
IFJ* m_spIFJTemp = ...
而不是
shared_ptr<IFJ> m_spIFJTemp = ...
然后使用valgrind
或其他工具来检查内存是否实际释放。
这清理了内容,因此shared_ptr在离开范围时没有问题:
m_spIFJTemp.reset(); /* remove shared_ptr referece before calling destructors */
Cleanup();
另一件可行的事情是在离开 ExecuteIt 方法后调用 Cleanup。
相关文章:
- 通过方法访问结构
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- 类变量无法从类方法访问
- 为什么从静态方法访问非静态方法是糟糕的设计
- 子类是否也在 c++ 中继承私有数据成员?但通过超类的公共方法访问
- 如何从回调方法访问自定义类成员
- 使初始化变量可供多个属性初始化方法访问
- 从c++中的方法访问指向对象的专用指针数组
- C++如何通过回调方法访问成员变量
- "undefined reference"从静态方法访问的模板类的静态成员
- 如何从方法访问类成员
- 类静态方法访问其静态数据成员
- 从静态方法访问非静态成员的工作示例
- 类方法访问其数据成员
- 通过公共方法访问私有成员变量
- 为什么无法从模板方法访问此类自己的受保护成员?
- 通过非静态方法访问静态成员
- JNI保留对对象的全局引用,并使用其他JNI方法访问它.在多个JNI调用中保持C++对象的活动状态
- 如何让一个方法访问其他模板类实例的私有成员
- 方法访问C++中的对象实例化