VS2015 C++编译器Bug一例

补充:

         不好意思, 非VC编译器的Bug, 是我自己的错误。ToString()的返回值是一个临时string, 执行完 const char* szText = const_cast<Test&>(tst).ToString().c_str();后, 临时string就会被销毁, szText所指向的string内容已经被销毁, 所以乱码。至于,g++编译, 输出结果正确, 有可能是vc++与g++对std::string的实现方式不同(引用: jackyjkchen  的回答: gcc的string使用了引用计数、写时拷贝,很可能不同情景下的析构有所区别)。

         顺便再次提醒大家谨慎使用string的c_str方法

参考文章:
1. 小心使用临时string对象的c_str()值

2. 聊聊C++临时对象的析构时间点------顺便再次提醒大家谨慎使用string的c_str方法





前天, VC2015编译的项目 出现莫名其妙的错误, 经过Debug, 发现类似下面示例代码中
"const char* szText = const_cast<Test&>(tst).ToString().c_str();" 输出结果不正常, szText Debug查看为乱码,
百思不得解, 只好将上句代码拆分为两行, 结果再次编译运行正常. 后来在Windows Mingw(gcc 4.9.2)下测试,
发现结果正常. 估计这是VC++的编译器的一个Bug.

#include <iostream>

class Test
{
public:
    std::string ToString()
    {
        return std::string("nihao");
    }
};

void test(const Test& tst)
{
    // 单独写一行, vs2015下, szText结果调试为乱码, 控制台输出为空
    // 而mingw编译输出正常
    const char* szText = const_cast<Test&>(tst).ToString().c_str();

    // 分两行, vs2015与mingw输出结果均正常
    std::string strText = const_cast<Test&>(tst).ToString();
    const char* szText2 = strText.c_str();

    std::cout << "szText:" << szText << '\n';
    std::cout << "szText2:" << szText2 << '\n';
}

int main()
{
    Test tst;

    test(tst);

    getchar();
}

测试环境 
系统: Win10 专业版 32bit
VS: VS Community 2015 版本 14.0.25431.01 Update3 .   编译测试程序 32bit
GCC: Windows gcc4.9.2  编译选项: g++ -std=c++1y .        编译测试程序 32bit

输出结果


 
VS2015

 
GCC


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值