gpt4 book ai didi

c++-cli - 在 C++/CLI 包装器中处理非托管字符串 - BLOCK_TYPE_IS_VALID、_CrtIsValidHeapPointer

转载 作者:行者123 更新时间:2023-12-01 02:50:05 25 4
gpt4 key购买 nike

我是 C++/CLI 的新手,但多年来一直在编写托管代码......显然太多年了。 :)

试图为第三方提供的非托管类编写包装器,我看到了一些奇怪的东西。我希望你们都可以帮助我清除我的讨厌和真正奇怪的东西。

CLI 包装器:

public ref class Wrapper
{
public:
Wrapper(const float* flts, unsigned int fltlen, int offset)
{
_unmanagedClass = new UnmanagedClass(flts, fltlen, offset);
}

~Wrapper()
{
delete _unmanagedClass;
}

String^ getSomeString()
{
string x = _unmanagedClass->getSomeString(); //1
String^ ret = gcnew String(x.c_str()); //2
return ret; //3
}

private:
UnmanagedClass* _unmanagedClass;
};

我还应该注意,我在标题中有这些指令;
#pragma managed(push, off)
#include "Unmanaged.h"
#pragma comment(lib, "lib\\Unmanaged_dll.lib")
#pragma managed(pop)

这是 Unmanaged.h;
class UNMANGED_API UnmanagedClass
{
public:
UnmanagedClass(const float* flts, uint fltlen, int offset);
string getSomeString() { return _someString; }

private:
string _someString;
};

这一切编译。然后陌生/缺乏经验开始了。

在调试配置中调试时, UnmanagedClass::getSomeString()似乎正在返回一个合理/预期的字符串值。我可以通过在 //2 上设置断点来看到这一点。并查看 x 的值.如果我走到 //3 ,我可以看到 ret具有值 x .但是,如果我尝试退出/越过 //3 ,我得到了几个失败的断言( BLOCK_TYPE_IS_VALID_CrtIsValidHeapPointer )并且调试器停止,永远不会返回到托管实现。

在 RELEASE 配置中调试它时,我没有得到失败的断言并返回到我的托管实现,但返回的字符串值是 getSomeString()在我偷看的地方都是垃圾; //2 , //3以及在托管实现中。

我以几种不同的方式对代码进行了修改,但无济于事。

我认为在 //2 周围需要进行一些混炼。 ,但就如何编码 basic_string 而言,我还没有找到任何真正重要的东西。到 System::String^ ,或者甚至需要。如果是这样,那么将不胜感激有关显式语法的一些帮助。

我还将产生失败断言的调用范围缩小到 //1通过返回 return ""; //3 .这些断言指向尝试修改/删除当前运行时可以访问的堆上不存在的内存。这是否与需要编码 UnmangedClass::getSomeString() 的返回值有关? ?

希望我只是在这里遗漏了一些简单的概念,并且第 3 方代码没有问题。请让我知道我是否可以提供更多细节,并为我几乎完全无知所有语言的祖父而道歉。

预先感谢您提供任何信息或“指针”;

编辑:添加 C# 托管客户端实现;
public unsafe string GetString(List<float> flts )
{
float[] fltArr = flts.ToArray();

Wrapper wrap;

fixed (float* ptrFlts = fltArr)
{
wrap = new Wrapper(ptrFlts , fltArr.Length, 0);
}

var x = wrap.getSomeString();
return x.ToString();
}

编辑:添加 Unmanged.dll!UnmangedClass::getSomeString() 的 Dumpbin.exe 签名
(public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Codegen::getSomeString(void))

最佳答案

此问题与.NET 或C++/CLI 无关,问题纯粹出在 native 代码中。

您违反了 std::string 的单一定义规则, 如果您的定义不完全匹配 Unmanaged_dll.dll使用,所有的 hell 都崩溃了。听起来好像该 DLL 用于调试定义/类布局。

关于c++-cli - 在 C++/CLI 包装器中处理非托管字符串 - BLOCK_TYPE_IS_VALID、_CrtIsValidHeapPointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5620386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com