Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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# P/调用和内存相关的间歇性崩溃_C#_C++_Marshalling_Unmanaged_Managed - Fatal编程技术网

C# P/调用和内存相关的间歇性崩溃

C# P/调用和内存相关的间歇性崩溃,c#,c++,marshalling,unmanaged,managed,C#,C++,Marshalling,Unmanaged,Managed,我很久以前就实现了这个API,所有的东西都运行得很好,直到几周前我注意到它,间歇性崩溃,著名的.NET中的封送处理“试图读取或写入受保护的内存。这通常表示其他内存已损坏”。我注意到还有一种模式与我打开的应用程序的数量有关,所以我假设它与内存有关。但在检查可用内存时,它仍然在崩溃时指向健康状态。请参见以下功能: C++ __declspec(dllexport) char* xReadData(char *p_buffer, int offset, int size) { // do

我很久以前就实现了这个API,所有的东西都运行得很好,直到几周前我注意到它,间歇性崩溃,著名的.NET中的封送处理“试图读取或写入受保护的内存。这通常表示其他内存已损坏”。我注意到还有一种模式与我打开的应用程序的数量有关,所以我假设它与内存有关。但在检查可用内存时,它仍然在崩溃时指向健康状态。请参见以下功能:

C++  
__declspec(dllexport) char* xReadData(char *p_buffer, int offset, int size)
{
    // do nothing
    return p_buffer; 
}

C#
[DllImport(PathToDll, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr xReadData([Out] IntPtr buffer, int offset, int size);

// SIZE = amount of bytes to read (2^13)
IntPtr pnt = Marshal.AllocHGlobal(SIZE);
...
try
{                                
    xReadData(pnt, 0, SIZE); >> crashing on [Managed to Native Transition]  

}
catch
{
}
...
Marshal.FreeHGlobal(pnt);
根据我的分析,它在完成本机函数和再次返回托管代码之间崩溃


提前感谢。

如果((偏移量>-1)和(offset+sizeWelcome to Stack Overflow!建议查看询问此类问题的指导原则:完全忽略本机代码中的size参数肯定会造成麻烦。是的,执行此操作时访问冲突是正常的。这是编辑部分的一个输入错误。现已更正。问题仍然存在。I希望我包括了指出问题所在所需的所有部分。感谢您的回复。这是真的,一个潜在的错误,只是在这种情况下,offset参数总是按值传递,并且是0。我非常确定崩溃不在本机代码中,因为我分析了它。我释放了缓冲区,真的。在崩溃时,它没有sn甚至无法释放缓冲区。它只是在完成本机函数和再次返回托管代码之间崩溃。@Allegro07;在调试时使用分治。开始一个接一个地清除这些东西。清除
memcpy
,看看崩溃是否仍然存在,如果存在?那么这部分是n为什么你的方法返回的代码与你输入的代码相同?<目前是C++函数的设计,这不是我的作品,我很愚蠢,我同意,但这不是重点。我避免了MimcPy动作,崩溃仍然在某个地方,但是这是一个很好的反馈,以改善问题输入数据,排除了MeMCPY。@ AffrR07,我没有太多可以告诉你的。创建一个新的测试项目,看看你是否能重现你所拥有的问题。看看如果没有从函数返回任何东西,它会更好。也可以在C++侧明确地设置调用约定。不要依赖编译器默认值。<代码>(dllexport)\uuu cdecl
或其他什么。哪些参数会改变?您总是调用(0,常量大小)?您是从不同的线程访问它吗?您在帖子中谈论的“特定模式”是什么。
if ((offset>-1) && (offset + size<= MAX_BYTES))
{
    memcpy(p_buffer, &(input_list[offset]), size);
}