创建对新对象的引用

Dan*_*tor 11 c++ parameter-passing reference-type

我刚刚学习C++,我遇到了以下难题:

作为一个C++新手,我读过使用引用而不是指针(如果可能的话)通常是一个好主意,所以我想尽早养成这个习惯.因此,我有很多具有一般形式的方法

void myMethod(ParamClass const& param);
Run Code Online (Sandbox Code Playgroud)

现在,我想知道调用这些方法的最佳方法是什么.当然,每个调用都需要一个不同的对象作为参数传递,据我所知,创建它的唯一方法是new运算符,所以现在我正在做以下事情:

myObject.myMethod(*new ParamClass(...));
Run Code Online (Sandbox Code Playgroud)

虽然这种方法完全有效,但我想知道是否还没有其他已经建立的"c ++方法".

谢谢您的帮助!担

Mat*_* M. 13

你应该尽量不要使用new,因为使用它会带来内存管理的麻烦.

对于您的示例,只需执行以下操作:

int main(int, char*[])
{
  SomeObject myObject;

  // two phases
  ParamClass foo(...);
  myObject.myMethod(foo);

  // one phase
  myObject.myMethod(ParamClass(...));

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我推荐第一种方法(两次),因为第二种方法存在微妙的问题.

编辑:评论不适合描述我所指的陷阱.

如上所述@Fred Nurk,该标准说明了临时工生活的一些事项:

[class.temporary]

(3)临时对象作为评估全表达式(1.9)的最后一步被销毁,该表达式(词法上)包含创建它们的点.即使该评估以抛出异常结束,也是如此.销毁临时对象的值计算和副作用仅与完整表达相关联,而不与任何特定子表达相关联.

(5)引用所约束的临时值或作为引用所约束的子对象的完整对象的临时值在引用的有效期内持续存在[注意:除少数情况外...]

(5)[例如...]函数调用(5.2.2)中的引用参数的临时绑定一直持续到包含该调用的完整表达式完成.

这可能导致两个微妙的错误,大多数编译器都没有捕获:

Type const& bound_bug()
{
  Type const& t = Type(); // binds Type() to t, lifetime extended to that of t
  return t;
} // t is destroyed, we've returned a reference to an object that does not exist

Type const& forwarder(Type const& t) { return t; }

void full_expression_bug()
{
  T const& screwed = forwarder(T()); // T() lifetime ends with `;`
  screwed.method(); // we are using a reference to ????
}
Run Code Online (Sandbox Code Playgroud)

Argyrios根据我的要求修补了Clang,以便它检测到第一个案例(还有一些我最初没有想过的案例).然而,如果实现forwarder不是内联的,那么第二个可能很难评估.