zoukankan      html  css  js  c++  java
  • 笔试题总结

    1.程序执行结果:崩溃

    class A{ int i; }; class B{ A *p; public: B(){p=new A;} ~B(){delete p;} }; void sayHello(B b){ } int main(){ B b; sayHello(b); }

    原因:

    调用sayHello() 传入 b 的时候,调用了默认拷贝构造函数。默认拷贝构造函数执行的是浅拷贝操作。直接把b对象中成员p的指针赋值给了新的对象。当执行完sayHello之后,新的对象析构 delete  原来的p。随后结束程序前 析构了旧的对象。又一次调用了delete p。两次delete p,就会崩溃了 

    C/C++开了一个特例:如果main函数没有返回值,那么相当于返回0。仅仅main函数如此

    双重delete,这是undefined behaviour,什么事情都可以发生。可以崩溃,可以机器冒烟,恶魔可以从程序员或者用户的鼻子里冒出来,你家的猫会怀孕,或者什么事都不发生,或者程序死循环,都可以。

    sayHello的问题,参数B默认拷贝构造是浅拷贝,导致析构了两次,崩了

    嗯,是这样,但是析构两次的结果是undefined behaviour,不一定崩溃。

    下列语句执行几次

    1 for(int i=10, j=1; i=j=0; i++, j--)()

    实验结果是执行0次,原因应该是第二个位置判断是错误的,非零即为真,将0改成1,2等之后都会无限循环

  • 相关阅读:
    源码安装php7.2
    Docker虚拟化之<基础命令>
    Docker虚拟化之<基础理论>
    旧版Linux系统下载地址
    Linux磁盘分区,挂载
    linux crond任务调度
    Linux学习之组管理和权限管理
    mysql 外键的基本使用
    Linux指令(压缩和解压类)
    Linux指令(搜索查找类)
  • 原文地址:https://www.cnblogs.com/wswang/p/5097962.html
Copyright © 2011-2022 走看看