c/c++开发分享pascal字符串如何在内存中表示?

pascal字符串如何在内存中排列?

我读到: http : //www.freepascal.org/docs-html/ref/refsu12.html它说字符串存储在堆上并且引用计数。 为了确定存储长度和引用的位置,我创建了一个字符串并对其进行了大量测试:

type PInt = ^Integer; var str: String; begin str := 'hello'; writeln(PInt(@str[1]) - (sizeof(integer) * 1)); //length writeln(PInt(@str[1]) - (sizeof(integer) * 2)); //reference count end. 

第一个打印长度,第二个打印参考计数。 它做得非常好并且有效。

现在我试图在C中模仿同样的事情:

 Export char* NewCString() { const char* hello_ptr = "hello"; int length = strlen(hello_ptr); //allocate space on the heap for: sizeof(refcount) + sizeof(int) + strlength char* pascal_string = (char*)malloc((sizeof(int) * 2) + length); *((int*)&pascal_string[0]) = 0; //reference count to 0. *((int*)&pascal_string[sizeof(int)]) = length; //length of the string. strcpy(&pascal_string[sizeof(int) * 2], hello_ptr); //copy hello to the pascal string. return &pascal_string[sizeof(int) * 2]; //return a pointer to the data. } Export void FreeCString(char* &ptr) { int data_offset = sizeof(int) * 2; free(ptr - data_offset); ptr = NULL; } 

然后在帕斯卡尔我做:

 var str: string; begin str := string(NewCString()); writeln(PInt(@str[1]) - (sizeof(integer) * 1)); //length - prints 5. correct. writeln(PInt(@str[1]) - (sizeof(integer) * 2)); //reference count - prints 1! correct. //FreeCString(str); //works fine if I call this.. end. 

pascal代码正确打印长度,并且由于赋值,引用计数增加1。 这是对的。

但是,一旦执行完毕,它就会严重崩溃! 它似乎试图释放字符串/堆。 如果我自己调用FreeCString,它就可以了! 我不确定发生了什么。

任何想法为什么崩溃?

    仅仅因为运行时系统在内存中以特定方式布置字符串,并不意味着编写C代码来复制该内存布局将起作用。 字符串管理可能涉及其他约束或外部数据结构。 要使字符串与FreePascal兼容,请使用FreePascal自己的库例程。

    这听起来像FreePascal需要除了free()之外的东西,当refcount归零时,但如果没有一些逆向工程或深入研究ABI规范,它很可能无法分辨。

    总之,不要 ,并且必须在极少数情况下向pascal添加构造函数和析构函数,并通过它进行所有分配。

    你可能想看一下Windows上的rtl / inc / astrings.inc Ps2,最容易使用COM兼容的宽带(BSTR)来处理中介语字符串类型。

      以上就是c/c++开发分享pascal字符串如何在内存中表示?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545976.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注