如何编写在函数执行过程中垃圾回收的测试用例?
How to write a test case which garbage collects in the middle of a function execution?
我有一个原生类:
class NativeClass
{
int someVariable;
public:
void someNativeFunction(){}
};
我有一个托管类,它轻轻地包装了这个本机类。
class ManagedClass
{
NativeClass *nativeClassObject;
public:
void someManagedFunction()
{
nativeClassObject->someNativeFunction();
}
};
我在 C# 应用程序中使用此托管类:
static void Main(string[] args)
{
ManagedClass objManagedClass = new ManagedClass();
objManagedClass.someManagedFunction();//line_1
//At this point onwards objManagedClass still has a reference on the stack, but is not used again.
//So, GC can delete this object.
}
由于objManagedClass
在line_1后不被引用,因此垃圾回收器可以自由销毁对象,即使它正在处理内部本机调用也是如此。这将导致objManagedClass
的破坏,进而破坏*nativeClassObject
。仅当someNativeFunction
分配大量内存或花费很长时间时,才可能发生这种情况,但可以肯定的是,我必须在调用后稍后添加对objManagedClass
的引用。
class ManagedClass
{
NativeClass *nativeClassObject;
public:
void someManagedFunction()
{
nativeClassObject->someNativeFunction();
...
...
System::GC::KeepAlive(this);
}
};
KeepAlive()
调用应防止 GC 销毁它。有什么方法可以测试这种情况吗?我可以编写的一些测试用例,如果我不提供KeepAlive()
就会失败,但是一旦我调用它就会通过吗?Thread.Sleep(5000)
托管函数之间的调用是否有帮助?
您可以通过调用GC::Collect
强制垃圾回收开始,然后使用GC::WaitForPendingFinalizers
等待垃圾回收完成。这应该允许你测试你的方案。
查看 MSDN 上的示例
相关文章:
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 从父数组测试用例构造二叉树失败
- 在Raspbian上编译pybind11测试用例时出现致命错误
- 我遇到了黑客排名中的问题"TWO STRINGS"的三个测试用例的分段错误。原因是什么?
- 某些测试用例未通过
- 如何在多个 Catch2 测试用例中检查相同的条件
- 谷歌启动2018,测试用例中的整数错误
- 用于查找连续子数组的最大总和的代码使测试用例失败
- 查找不适用于 c++ 中特定测试用例的最长子字符串
- 测试用例状态为失败,但返回的值为 true
- kill syscommand 在 Catch2 测试用例中失败
- 大型测试用例中C++ dfs 问题中的小错误
- 为什么在输入的第一行输入测试用例数量后得到垃圾值?
- C++ Catch 是否有类似 NUnit 的测试用例的东西,具有多个参数/输入选项
- 如何修复此代码对几个测试用例的错误答案?
- 所有测试用例都将小数点转换为二进制数
- C++回文检查解决方案被一个测试用例跳闸
- 测试用例大小为 10 的向量失败
- 将 argc 和 argv 传递给 QApplication 到单元测试用例方法中
- 编写函数测试用例时存在疑问