zoukankan      html  css  js  c++  java
  • goto语句引起的crosses initialization of XXX

    1. 背景

    goto语句虽然目前已经不提倡使用,但是用起来还是很方便,尤其是老代码中见的比较多。

    在改动有goto语句的老代码时需要特别注意,是否跳过来资源的释放、有用变量的初始化等等

    很久之前写c程序时,有些提交系统要求变量必须在函数开始地方全部申明,最近遇到了"crosses initialization of XXX"知道为什么了。就是因为有可能跳过变量的声明。

    2. 代码例子

    例子1:

     1 #include <iostream>
     2 class Test{
     3 public:
     4     int a;
     5 };
     6 
     7 int main(){
     8     Test t1; 
     9     std::cout << "ok" << std::endl;
    10     goto _Lab1; 
    11     Test *t2 = new Test; //1 
    12     //Test t2;  //2
    13 _Lab1:
    14     std::cout << t2->a << std::endl;    //1 
    15     //std::cout << t2.a << std::endl;   //2
    16     return 0;
    17 }

    从代码中也可以看出来,

    (1) 在只打开第一种情况下,“goto _Lab1”跳过来t2变量的定义,导致t2没有初始化。编译报错。

    (2) 在只打开第二种情况下,由于Test类没有显示构造函数,编译器会提供无参数的默认构造函数。编译正常。执行后t2.a 是随机的int值。

    例子2:

     1 #include <iostream>
     2 class Test{
     3 public:
     4     Test(int _a):a(_a){};   //提供显示构造函数
     5     int a;
     6 };
     7 
     8 int main(){
     9     Test t1(1);
    10     std::cout << "ok" << std::endl;
    11     goto _Lab1; 
    12     Test t2(3); //没有执行初始化
    13 _Lab1:
    14     std::cout << t2.a << std::endl;
    15     return 0;
    16 }

    Test类显示提供了带参数构造函数后,t2由于goto语句导致未初始化,编译失败。

     

  • 相关阅读:
    node环境下安装vue-cli
    Git 查看、删除、重命名远程分支
    git 错误 fatal: Not a valid object name: 'master'.
    爬虫基本原理
    最长非重复子串(python实现)
    数据分析初步(jupyter常用快捷键,numpy,pandas,matplotlib常用用法)
    学linux,这篇就够了
    爬虫之requests
    nginx配置
    Linux下uwsgi服务器配置及重启
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/9175963.html
Copyright © 2011-2022 走看看