Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C++ DLL的C应用程序内存使用 只是为了正确地对待,我想知道你的意见,如果我的想法是正确的,那么数据流是如何在C程序调用C++ DLL的情况下,以委托为参数的。 系统为C程序提供内存 C程序加载.dll,并将其空间提供给C++ DLL。在这个空间中不会有C垃圾收集,只有当.dll被卸载,然后可以释放整个空间。 调用C++函数。特定函数有一个委托作为参数。我们跳入C++内存区域并声明一些变量。C++函数将在其代码中的某个地方调用C委托。 C代表在C内存上操作,如果C语言内存是本地类型,或者C++内存中的变量,如果C是复杂类型的,则将有一个输入参数的拷贝。如果我们有本地类型,我可以把它保存到C世界中,一切都会好起来。但是如果它是一个引用,我把它保存到C内存中,如果我结束了C++函数,我会得到未定义的行为,因为变量将超出范围并被销毁。 C函数结束,我们得到C++中的返回值作为复制或指针返回值,如果是复数类型,指针将指向C内存。 C++函数结束,C++函数的已使用内存被释放_C#_C++_Memory Management_Dll - Fatal编程技术网

C# 使用C++ DLL的C应用程序内存使用 只是为了正确地对待,我想知道你的意见,如果我的想法是正确的,那么数据流是如何在C程序调用C++ DLL的情况下,以委托为参数的。 系统为C程序提供内存 C程序加载.dll,并将其空间提供给C++ DLL。在这个空间中不会有C垃圾收集,只有当.dll被卸载,然后可以释放整个空间。 调用C++函数。特定函数有一个委托作为参数。我们跳入C++内存区域并声明一些变量。C++函数将在其代码中的某个地方调用C委托。 C代表在C内存上操作,如果C语言内存是本地类型,或者C++内存中的变量,如果C是复杂类型的,则将有一个输入参数的拷贝。如果我们有本地类型,我可以把它保存到C世界中,一切都会好起来。但是如果它是一个引用,我把它保存到C内存中,如果我结束了C++函数,我会得到未定义的行为,因为变量将超出范围并被销毁。 C函数结束,我们得到C++中的返回值作为复制或指针返回值,如果是复数类型,指针将指向C内存。 C++函数结束,C++函数的已使用内存被释放

C# 使用C++ DLL的C应用程序内存使用 只是为了正确地对待,我想知道你的意见,如果我的想法是正确的,那么数据流是如何在C程序调用C++ DLL的情况下,以委托为参数的。 系统为C程序提供内存 C程序加载.dll,并将其空间提供给C++ DLL。在这个空间中不会有C垃圾收集,只有当.dll被卸载,然后可以释放整个空间。 调用C++函数。特定函数有一个委托作为参数。我们跳入C++内存区域并声明一些变量。C++函数将在其代码中的某个地方调用C委托。 C代表在C内存上操作,如果C语言内存是本地类型,或者C++内存中的变量,如果C是复杂类型的,则将有一个输入参数的拷贝。如果我们有本地类型,我可以把它保存到C世界中,一切都会好起来。但是如果它是一个引用,我把它保存到C内存中,如果我结束了C++函数,我会得到未定义的行为,因为变量将超出范围并被销毁。 C函数结束,我们得到C++中的返回值作为复制或指针返回值,如果是复数类型,指针将指向C内存。 C++函数结束,C++函数的已使用内存被释放,c#,c++,memory-management,dll,C#,C++,Memory Management,Dll,我说的对吗?这应该在 如果它们是本地类型,或者引用C++内存中的变量,则为复杂类型。如果我们有本地类型,我可以把它保存到C世界中,一切都会好起来。但是如果它是一个引用,我把它保存到C内存中,如果我结束了C++函数,我会得到未定义的行为,因为变量将超出范围,并且将被破坏< /P> 我的理解是,封送拆收器要么将复杂类型转换为结构,要么将指针转换为IntPtr。结构是按值传递的,因此在托管内存中可能有一个副本在堆栈上。指针需要不安全的代码才能访问,因此您将负责安全地处理这些指针 C++作为返回值的副本

我说的对吗?

这应该在

如果它们是本地类型,或者引用C++内存中的变量,则为复杂类型。如果我们有本地类型,我可以把它保存到C世界中,一切都会好起来。但是如果它是一个引用,我把它保存到C内存中,如果我结束了C++函数,我会得到未定义的行为,因为变量将超出范围,并且将被破坏< /P> 我的理解是,封送拆收器要么将复杂类型转换为结构,要么将指针转换为IntPtr。结构是按值传递的,因此在托管内存中可能有一个副本在堆栈上。指针需要不安全的代码才能访问,因此您将负责安全地处理这些指针

C++作为返回值的副本或指针,如果它是复杂类型,指针将指向C内存

实际上,托管函数无法以安全的方式返回指向托管内存的指针。要创建指针,您需要修复该对象以防止GC移动它,但修复是有范围的,因此对于返回值不起作用


我个人认为编组规则有点复杂,如果没有其他理由,我宁愿保留任何P/VoCK简单的方法,而不是回避有关安全的问题。对于C和C++之间更复杂的互操作性,我建议C++/CLI。这允许您自己进行类型转换,并添加了一整套工具,您可以使用这些工具来确保正确的功能。

请每个问题回答一个问题。谢谢,因为您没有提到我的想法中的错误,我认为哪一部分可以控制哪一个内存,我认为我的想法是正确的。关于封送器的文档帮助了我很多,我没有考虑GC移动部分。你为我的进一步工作提供了很大的帮助