C++经典面试题(最全,面中率最高)

1.new、delete、malloc、free关系

delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。 Read more

C++知识点

操作符重载

赋值运算符重载

  • 返回值的类型为引用,并在函数结束前返回实例自身的引用(*this)。但是返回引用的目的不是为了允许连续赋值,因为返回实例本身也可以连续赋值。返回引用是为了提高效率。如果返回实例,赋值运算符重载函数会自动调用拷贝构造函数创建一个临时对象,并在连续赋值完毕后自动调用析构函数,增加了程序开销。另外,如果没有自己定义性能良好的拷贝构造函数,会调用默认拷贝构造函数。而默认拷贝构造函数的是浅拷贝,当实例中有指针时,无法正确拷贝一个实例。需要注意的是,当返回值的类型为引用时,赋值操作符号返回一个reference(引用)指向操作符号的左侧实参(而事实上重载运算符的左侧实参就是调用对象本身)。
  • 传入的参数应该是常量引用。引用的目的是为了不调用拷贝构造函数,常量的目的是在赋值操作符重载函数中不会修改传入的参数。
  • 是否释放已有的内存。如果我们忘记在分配新内存之前释放自身已有的空间,则程序将出现内存泄漏。
  • 判断传入的参数是不是当前的实例(*this)。如果事先不判断就赋值,那么在释放自身内存后,就无法找到需要赋值的内容了。

 

 

SHELL学习笔记之分割字符串

分割后的item_array是一个数组,数组下表从0开始。

${item_array[1]}           # 获取数组的第1个元素
${item_array[*]}           # 数组的所有元素.
${item_array[@]}         # 同${names[*]}.
${#item_array[1]}         # 获取数字第1个元素的内容的长度.
${#item_array[*]}         # 获取数组中的元素个数.
${#item_array[@]}       # 同${#names[*]}.

Solution2 for GSH

 

Solution for GSH

 

tensorboard的使用方法

编写完代码之后,打开terminal,首先激活anaconda环境

source activate tensorflow

然后进入存放events.out.tfevents.xxxxxxx文件的上一层目录,即下面命令中的logs/,然后运行命令

tensorboard --logdir='logs/'

命令中的logs/是存放events.out.tfevents.xxxxxxx文件的文件夹。至于文件夹为什么是logs,而不是别的名字,是因为我在代码中写的就是logs文件夹。

然后打开终端中显示出的链接,在浏览器中查看。

Read more