# C++疑问

## 1. 内存相关

**问：**&#x5728;c++中主动为变量申请和回收内存，那么在一些程序中没有主动回收内存的代码是怎么运行的呢？什么时候回收内存？

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

## 2. 内联函数

**问：**&#x5185;联函数的作用是什么，它与成员函数的区别在哪里？

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

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

## 3. new一个对象

**问：**&#x4F7F;用new初始化一个对象与不使用new的区别是什么？比如下面的代码都是初始化一个对象：

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

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

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

**问：**&#x52A8;态分配内存的好处以及存储的位置，和静态分别内存的区别是什么？

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

**问：**&#x96BE;道不能像java的方法一样直接返回值就是对象数据么？

**答：**&#x43;++如果返回对象的话是返回对象的一个拷贝，而不是像java那样返回引用。

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

**问：**&#x6808;内存的大小是如何确定的，什么时候会导致栈溢出？

**答：**&#x6808;内存的大小都是固定的，在linux上可以使用`ulimit -s`查看栈内存的大小，单位是k。eg：

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jun-wang.gitbook.io/learnjava/bian-cheng-yu-yan/c++/c++-yi-wen.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
