C++疑问

1. 内存相关

问:在c++中主动为变量申请和回收内存,那么在一些程序中没有主动回收内存的代码是怎么运行的呢?什么时候回收内存?

答:在函数中声明的变量都在栈内存中,随着方法运行的结束而结束,而new出来的对象在堆内存,必须手动回收,否则只有在程序运行终止的时候才回收内存,在运行期间很可能造成内存泄漏。(内存泄漏是申请的内存没有及时回收,内存溢出是指有没有足够的内存分配给新对象)

2. 内联函数

问:内联函数的作用是什么,它与成员函数的区别在哪里?

答:内联函数类似宏定义,在函数执行的时候不是去调用它而是在编译的时候就已经把调用的代码替换成了内联函数的函数体,省去了调用函数的系统开销,因此速度比较快,但是如果多处地方调用此函数,那么就会被拷贝多次,因此在运行速度快的情况下也带来了占用内存的问题,所以因需使用。

内联函数不需要函数声音,因此一般内联函数的定义写在头文件中。

3. new一个对象

问:使用new初始化一个对象与不使用new的区别是什么?比如下面的代码都是初始化一个对象:

Person zhangsan = Animal("zs",12);
Person *zhangsan = new Animal("zs",12);

答:使用new初始化对象存储的位置为堆内存,需要程序主动使用delete释放内存,而在方法中不使用new时,对象存放的位置是栈内存,这一部分内存会随着方法的结束而被回收,程序不需要关注。

4. 动态分配内存和静态分配内存的区别

问:动态分配内存的好处以及存储的位置,和静态分别内存的区别是什么?

5.C++函数中为啥使用入参来接收返回数据

问:难道不能像java的方法一样直接返回值就是对象数据么?

答:C++如果返回对象的话是返回对象的一个拷贝,而不是像java那样返回引用。

6. 栈内存的大小如何确定

问:栈内存的大小是如何确定的,什么时候会导致栈溢出?

答:栈内存的大小都是固定的,在linux上可以使用ulimit -s查看栈内存的大小,单位是k。eg:

# 查看栈内存的大小:10M
$ ulimit -s
10240
# 设置栈内存大小
$ ulimit -s 8192
# 显示当前的各种用户进程限制
$ ulimit -a

Last updated