Desktop Postflop:免费开源德州扑克GTO求解器终极指南
2026/5/5 22:37:29
博主介绍:程序喵大人
最近遇到了个奇怪的问题,同样的代码,在Windows 下正常运行,在iOS下必现crash。
异常代码如下:
std::stringStringPrintf(constchar*format,...){va_list ap;va_start(ap,format);char*buffer=nullptr;constsize_t size=std::vsnprintf(nullptr,0,format,ap)+1;buffer=newchar[size];std::vsnprintf(buffer,size,format,ap);va_end(ap);std::stringresult(buffer);delete[]buffer;returnresult;}经过分析定位后发现,这里重复使用了va_list并且在vsnprintf后还继续使用了ap,进而导致的crash。
通过查看文档:https://port70.net/~nsz/c/c11/n1570.html#7.21.6.8
这里明确说明,arg在vsnprintf后,会变成不确定的状态。所以才有了在Windows上可以正常运行,在iOS上会异常退出的问题。
标准做法是使用va_copy复制一份va_list,如下:
std::stringStringPrintf(constchar*format,...){va_list ap,ap_copy;va_start(ap,format);va_copy(ap_copy,ap);constint32_tsize=std::vsnprintf(nullptr,0,format,ap)+1;va_end(ap);if(size<=0){return"";}char*buffer=newchar[size];std::vsnprintf(buffer,size,format,ap_copy);va_end(ap_copy);std::stringresult(buffer);delete[]buffer;returnresult;}以前都是直接使用的三方库StringPrintf,而没有自己实现。这也算是使用vsnprintf过程中遇到的一个小坑,在此分享记录一下。
码字不易,欢迎大家点赞,关注,评论,谢谢!