【问题标题】:Managed C++ pass float *OUT as argument托管 C++ 将 float *OUT 作为参数传递
【发布时间】:2013-09-28 14:46:40
【问题描述】:

我为非托管 C++ 库制作 .Net 包装器。我需要使用带有此签名的函数:

BOOL Func ( float *OUT floatArray)

我在托管 C++ 中试过这个:

float* mp = new float(10);
bool what = Func(mp);

但我遇到了 AccessViolationException。 (尝试读取或写入受保护的内存。这通常表明其他内存已损坏。) 怎么了?

这是我在托管 C++ 中的函数:

bool MyFunc (array<Single>^% floatArray)

我正在尝试使用此函数返回 C# float[]。也许还有另一种选择来完成我的任务。

【问题讨论】:

  • 你能说明你是如何从 C# 调用它的吗?
  • var d = new MyClass();浮动[] a = 新浮动[10]; var id = d.Func( 参考 a);我什至不尝试在异常之前访问它。有错误的托管 C++ 代码: bool Func (array^% floatArray) { float mp[10] = {0}; bool what = managedFunc(mp);}
  • 你为什么不使用“float* mp = new float[10];”? (带方括号)。
  • 我试过了。同样的错误。仅当我传递 float *mp 变量而不分配值时才有效。但是我不知道如何从这个指针创建一个数组。

标签: c# c++ unmanaged managed


【解决方案1】:

将一块在 C++ 中分配(new'ed)的非托管内存返回给 C# 在几个方面似乎是一个相当糟糕的主意(谁负责释放(delete[]'ing)内存?我怀疑如果你在 C++ 中使用 System::Array 并通过 'ref' 传递值(在 c# 中)会更好。

【讨论】:

  • bool managedFunc (array^% lpValues) { float *mp = new float[10];布尔什么 = unmanagedFunc(mp);返回什么;然后我想将 mp 数组中的值分配给循环中的 lpValues。但是 unmanagedFunc 会抛出 accessViolationException。
猜你喜欢
  • 2011-05-29
  • 2010-11-25
  • 1970-01-01
  • 2021-08-19
  • 2023-04-09
  • 2015-08-14
  • 2023-03-16
  • 1970-01-01
  • 2011-01-23
相关资源
最近更新 更多