导入"RegExp.tlb" C++ COM 接口是否在进程之间隐式共享内存?
Is C++ COM interface for imported "RegExp.tlb" implicitly sharing memory between processes?
好时机。如果我的问题很奇怪,我很抱歉,但我对所面对的事情很陌生。
我的案例如下,我通过COM在C++中使用VBRegExp,如下所示:
#import "RegExp.tlb" no_namespace
...
void DoSomething() {
...
static IRegExpPtr regExp( __uuidof(RegExp) );
regExp->Pattern = A2BSTR(m_szStrReg); // read on dll load from the file
if ( regExp->Test(someString) ) {
IMatchCollectionPtr matches = regExp->Execute(someString);
// my staff here
...
}
...
}
我的问题是:
我做的每件事都对吗?(附言:我知道CoInit和CoUninit,但问题不在于它们)。
regExp
过程安全吗我问这个问题的原因是,我的类有几个实例,DoSomething()
多次调用它。我在regExp内部有崩溃。由堆损坏/在具有不同参数的regExp方法的不同调用中随机访问无效内存引起。
我已经检查了regExp指针值,regExp->Pattern.GetAddress()等等。它们在不同的进程中是不同的。但是,当我添加了命名为Mutex并用它包装DoSomething()
时,添加了进程间同步——崩溃DISSAPPEARD。这就是为什么我要问regExp是否在进程之间隐含地共享了一些东西?
您的代码正在处理居住在当前公寓中的COM接口指针。您已经知道COM初始化,所以如果您在STA中,则当前单元表示当前线程。可以保证接口指针的方法是可调用的,但该接口指针的后端可能会有所不同:它可以是直接实现的,也可以是将调用转移到实际对象所在的单元中的辅助对象(代理)。后者尤其可能处于另一个过程中。
这都是线程安全和"进程安全"的。参数与对实际对象的调用一起获取,然后再传输回来。调用者不必关心它是在处理真实对象还是代理,被调用者也不需要知道它是由实际调用者调用还是由助手存根调用。
话虽如此,上面的代码片段还是不错的。你发生的车祸肯定另有原因。
相关文章:
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Directx 12 :在两个进程之间共享图形内存
- 如何在窗口之间移动 std::unique_ptr 而不会冒内存泄漏的风险?
- 多个线程之间的获取-释放内存顺序
- 按引用传递和动态内存分配之间的区别是什么
- 在内存使用方面,c++ 中的 map 和 unordered_map 之间有什么区别吗?
- 为什么Valgrind-Massif和最高内存消耗之间会有不同的范围
- VS 2008 和 VS 2017 之间的可视化C++内存管理更改
- 可能的数据竞争在内存中写入相同地址之间
- 使用用户模式和内核之间共享内存的慢速通信
- 两个进程之间的共享映射内存在编辑时未更新
- 内存泄漏,访问释放内存和双重免费之间有什么区别
- C++动态变量和未定义内存之间的差异
- 为什么堆栈中的函数局部变量之间存在内存空间
- 在 C++ 和 C# 之间共享内存映射文件结构
- boost::OSX 上 32 位和 64 位程序之间共享内存中的进程间同步机制(互斥体、条件)
- 在C/C++和Python之间共享内存
- 在应用程序和驱动程序之间共享内存
- 将对象放在共享内存中以便在 .so 之间使用
- 通过共享内存IPC在过程之间共享指针