【发布时间】:2013-08-12 16:44:16
【问题描述】:
好时光。对不起,如果我的问题很奇怪,但我对我所面临的事情是新的。
我的情况如下,我通过 COM 在 C++ 中使用 VB RegExp 如下:
#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
...
}
...
}
我的问题是:
我做得对吗? (p.s. 我知道 CoInit 和 CoUninit,但问题不在于它们)。
regExp进程安全吗? 我问这个的原因是因为我的班级有几个实例,DoSomething()多次调用它。我在 regExp 内部有崩溃。由不同 args 的 regExp 方法的不同调用随机导致堆损坏/无效内存访问。
我检查了 regExp 指针值,regExp->Pattern.GetAddress() 等等。并且它们在不同的过程中是不同的。但是当我添加了名为 Mutex 并用它包装 DoSomething() 时,它添加了进程间同步 - 崩溃消失了。这就是为什么我要问 regExp 是否在进程之间隐式共享了一些东西?
【问题讨论】:
-
闻起来像你是多线程的,并且有多个线程使用单个 regExp 实例
-
这里似乎也有泄漏:
regExp->Pattern = A2BSTR(m_szStrReg),假设Pattern是_bstr_t类型。另外,你真的是想让static IRegExpPtr regExp成为静态的吗? -
@pm100 不,同一进程中只有一个线程。
-
@Mihail,
_bstr_t确实使用SysAllocString复制了传递的字符串。然而A2BSTR也使用SysAllocString(看看atlconv.h),这就是这行代码泄漏的地方。也许,你想要RegExp->Pattern = A2W(m_szStrReg)? -
@Noseratio 非常感谢您的通知!
标签: c++ regex com interprocess