使用dll中的类时,内存无效
invalid memory when using classes from a dll
这是我第一次尝试从dll导出一个类。我所做的是:创建一个接口(只支持纯虚方法)-在DLL中用一个不能导出的类实现了这个接口类有一个释放方法,在它的this指针上调用delete-创建了一个带有静态方法的工厂类,该方法返回一个指向具体类的指针,但作为接口。这个类是导出的。-通过调用其释放方法来删除返回对象。
我把所有这些都从这个教程中关于dll中的类中摘取下来。
问题是,当我在另一个项目中使用这个dll时,一切都很顺利,直到我调用对象上的释放函数。然后它显示一个断言失败窗口,消息为"_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));"
这件事发生在别人身上了吗?我知道这就像你在开始c++时忘记使用std::一样简单,但正如我所说的,我刚刚开始。
谢谢!
是否在header中定义了工厂函数?如果是,并且用于创建对象的new
在头文件中,那么从DLL中调用delete
可能会导致此错误。工厂函数需要由DLL导出,只有声明必须出现在头文件中。
例如,你的标题应该像这样行:
class MyInterface
{
public:
virtual void DoSomething() = 0;
virtual ~MyInterface() {}
};
__declspec(dllexport) MyInterface * __stdcall MyInterfaceFactory();
MyInterfaceFactory()
的实现必须包含在DLL中
谢谢你的回答,我很抱歉我白开了这个头!
问题非常简单,但隐藏在接口、工厂和其他一些东西后面。我返回一个指针,指向一个被声明为静态的对象,因为它必须是单例的。然后我试着释放这个物体。一堆腐败!!
我的单例对象一开始就不应该有释放函数;我将通过在一个单独的接口中提取释放函数来解决这个问题,该接口将仅由非静态对象实现。
相关文章:
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 获取进程内存信息失败,错误 6 句柄无效
- 其他线程堆栈上的可用内存无效
- 不同类的虚拟函数共享相同的(无效?)内存地址
- 调用 GetPointerFrameTouchInfo时出现错误 998(对内存位置的无效访问)
- VerQueryValueA 在资源块之外写入无效内存
- Realloc():即使使用malloc()分配内存,旧大小也无效
- JNA 参数问题:内存访问无效
- Valgrind 未显示使用不正确的 c_str() 的无效内存访问
- JNA无效的内存访问
- 发生 JNI 调用 c++ dll "不满意链接错误: 对内存位置的无效访问"
- 只要我不使用它,我是否可以安全地创建对可能无效内存的引用?
- 为什么在realloc之后字符串在内存中变得无效
- 我的代码中真的有无效的内存访问吗
- 释放内存失败:free():下一个大小无效(快速):
- Python ctypes:如何释放内存?获取无效指针错误
- 获取错误代码 998 尝试从命名管道读取时对内存位置的访问无效
- 赋值运算符重载和无效内存
- 内存错误: free(): 下一个大小无效 (快速)
- 使用dll中的类时,内存无效