一个包含成员初始化列表的代码示例。
因此,
#include <memory>
struct Throwable
{
Throwable()
{
throw "Exception!";
}
};
struct A
{
A() : t(Throwable()), i(new int()) {}
Throwable t;
std::unique_ptr<int> i;
};
如果按照以下评估顺序,我是否可能有内存泄漏?
new int()
Throwable()
t()
i()
标准中的顺序是什么?我们有一些规则。
https://en.cppreference.com/w/cpp/language/initializer_list
3)接下来,非静态数据成员按照在类定义中的声明顺序进行初始化。因此,
t
将在i
之前构造。
https://en.cppreference.com/w/cpp/language/eval_order
9) 内置逗号运算符的第一个(左)参数的每个值计算和副作用都在第二个(右)参数的每个值计算和副作用之前被排序。
但成员初始化列表由于先前的引用而不使用所有逗号规则。而且它不是逗号运算符(https://en.cppreference.com/w/cpp/language/operator_other#Built-in_comma_operator)。
10) 在列表初始化中,给定初始化程序子句的每个值计算和副作用都在大括号包围的逗号分隔的初始化器列表中跟随它的任何初始化程序子句的每个值计算和副作用之前被排序。
并且 https://en.cppreference.com/w/cpp/language/list_initialization
在以下情况下执行列表初始化:
5) 如果使用了大括号初始化列表,则在构造函数的成员初始化列表中
我还有另一个情况。
你能提供定义成员初始化列表中参数求值顺序的规则吗?