大佬教程收集整理的这篇文章主要介绍了没有副本的指针的Perl SV值,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我找到了以下示例:
SV *r = sv_newmortal(); SvPOK_on(r); sv_usepvn_mg(r,string,strlen(string) + 1);
但我对XS内部结构并不十分了解并且有一些疑问.
如果你不能使用Newx分配内存块,那么你最好的选择可能是创建一个SvLEN设置为零的只读SV.这告诉Perl它不拥有内存. SV可以被祝福成一个具有析构函数的类,该析构函数将使用适当的deallocator释放内存.
如果您可以使用Newx分配内存块,则可以使用以下内容:
SV* newSVpvn_steal_flags(pTHX_ const char* ptr,STRLEN len,const U32 flags) { #define newSVpvn_steal_flags(a,b,c) newSVpvn_steal_flags(aTHX_ a,c) SV* sv; assert(!(flags & ~(SVf_UTF8|SVs_TEMP|SV_HAS_TRAILING_NUL))); sv = newSV(0); sv_usepvn_flags(sv,ptr,len,flags & SV_HAS_TRAILING_NUL); if ((flags & SVf_UTF8) && SvOK(sv)) { SvUTF8_on(sv); } SvTAINT(sv); if (flags & SVs_TEMP) { sv_2mortal(sv); } return sv; }
注意:ptr应指向由Newx分配的内存,并且它必须指向Newx返回的块的开头.
注意:接受标志SVf_UTF8(指定ptr是要在Perl中看到的字符串的UTF-8编码),SVs_TEMP(在SV上调用sv_2mortal)和SV_HAS_TRAILING_NUL(见下文).
注意:某些代码期望标量的字符串缓冲区具有尾随NUL(即使缓冲区的长度已知,即使缓冲区可以包含NUL).如果您分配的内存块具有超出数据末尾的尾随NUL(例如,C样式的NUL终止字符串),则传递SV_HAS_TRAILING_NUL标志.如果没有,该函数将尝试扩展缓冲区并添加NUL.
以上是大佬教程为你收集整理的没有副本的指针的Perl SV值全部内容,希望文章能够帮你解决没有副本的指针的Perl SV值所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。