C++函数初始化和内存泄漏

C++ function initialization and memory leaks

本文关键字:内存 泄漏 初始化 函数 C++      更新时间:2023-10-16

在调用C++函数时,是否预先初始化了函数中的所有变量,无论它们在哪里声明?我问这个问题是因为我想知道在整个函数执行之前退出一个函数是否会导致返回语句后声明的变量内存泄漏。例如:

string oddOrEven(int a)
{
 if ((a % 2) != 0)
 {
    string odd{ "the number is odd" };
    return odd;
 }
 else
 {
    string even{ "the number is even" };
    return even;
 }
}

这段代码仅用于演示

如果交给函数的是一个奇数,是否永远不会创建字符串even{}?因为如果要创建它,这难道不意味着当函数在if-else块的第一部分退出时,字符串将成为内存泄漏吗?

字符串even是else块的本地字符串,如果a是奇数,则不会创建该字符串。

注意:局部变量,即使是直接在函数内部声明的变量,也不会自动初始化;只有在所有函数外部声明的全局变量才会自动初始化。。

参考:

http://www.tutorialspoint.com/cplusplus/cpp_variable_scope.htm

从下面的URL:"在条件(块)中声明的局部变量将在条件结束时超出范围。"

if语句中变量的范围

一旦程序离开函数oddOrEven(int a),该函数的所有局部变量都将被销毁,并返回您的string

如果传递给函数的是奇数,则永远不会创建字符串even{}。

其他答案试图解决的问题是,包括oddeven在内的所有局部变量在退出创建它们的范围时都会被销毁。

odd(或even)不是函数返回的内容。返回的是oddeven的临时副本,调用者知道要删除此副本。

注意:这是忽略返回值优化(RVO),因为这只会使情况更加混乱。