X* x = new X;
Y* y = new Y;
unique_ptr<X> px(x);
unique_ptr<Y> py(y);
foo(px,py);
Валидно? Валидно — порядок вычисления аргументов функции неспецифицирован.
Где тут утечка может быть, видно? Если нет, подумай, что произойдет, если конструктор Y бросит исключение.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, saf_e, Вы писали:
_>>Разве с точки зрения стандарта тут возможен лик? Если да ткните, пожалуйста, в конкретное место.
_>>
J>X* x = new X;
J>Y* y = new Y;
J>unique_ptr<X> px(x);
J>unique_ptr<Y> py(y);
J>foo(px,py);
J>
J>Валидно? Валидно — порядок вычисления аргументов функции неспецифицирован. J>Где тут утечка может быть, видно? Если нет, подумай, что произойдет, если конструктор Y бросит исключение.
Мне казалось что стандарт рассматривает unique_ptr<X>(new X)как монолитное выражение и не бьет его. Собственно вот про этот момент и хотелось бы почитать.
И если в /* 2 */ случится исключение, то tmp1 будет потерян...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, saf_e, Вы писали:
_>Мне казалось что стандарт рассматривает unique_ptr<X>(new X)как монолитное выражение и не бьет его. Собственно вот про этот момент и хотелось бы почитать.
монолитное выражение в смысле сторонних эффектов (старые уже отработали, новые еще не начались) — это выражение между двумя точками следования (по терминологии С++03). А тут только одна точка следования — в конце полного выражения (где точка с запятой). Так что внутри можно тасовать все как угодно, в том числе и как я показал.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, saf_e, Вы писали:
_>>Мне казалось что стандарт рассматривает unique_ptr<X>(new X)как монолитное выражение и не бьет его. Собственно вот про этот момент и хотелось бы почитать.
J>монолитное выражение в смысле сторонних эффектов (старые уже отработали, новые еще не начались) — это выражение между двумя точками следования (по терминологии С++03). А тут только одна точка следования — в конце полного выражения (где точка с запятой). Так что внутри можно тасовать все как угодно, в том числе и как я показал.
Эм, а разве запятые не являются точками следования? Т.е. выражение между запятыми должно быть вычисленно до другого.
Кстати, а что говорит новый стандарт, кажется точки следования отменили...
Здравствуйте, saf_e, Вы писали:
_>Здравствуйте, jazzer, Вы писали:
J>>Здравствуйте, saf_e, Вы писали:
_>>>Мне казалось что стандарт рассматривает unique_ptr<X>(new X)как монолитное выражение и не бьет его. Собственно вот про этот момент и хотелось бы почитать.
J>>монолитное выражение в смысле сторонних эффектов (старые уже отработали, новые еще не начались) — это выражение между двумя точками следования (по терминологии С++03). А тут только одна точка следования — в конце полного выражения (где точка с запятой). Так что внутри можно тасовать все как угодно, в том числе и как я показал.
_>Эм, а разве запятые не являются точками следования? Т.е. выражение между запятыми должно быть вычисленно до другого.
Запятая, которая оператор-запятая, является точкой следования, это так. Но она не имеет никакого отношения (кроме чисто визуального) к запятой, разделяющей выражения, инициализирующие аргументы функции.
_>Кстати, а что говорит новый стандарт, кажется точки следования отменили...
Да, теперь там понятия типа happens before.
Здравствуйте, saf_e, Вы писали:
J>>монолитное выражение в смысле сторонних эффектов (старые уже отработали, новые еще не начались) — это выражение между двумя точками следования (по терминологии С++03). А тут только одна точка следования — в конце полного выражения (где точка с запятой). Так что внутри можно тасовать все как угодно, в том числе и как я показал.
_>Эм, а разве запятые не являются точками следования? Т.е. выражение между запятыми должно быть вычисленно до другого. _>Кстати, а что говорит новый стандарт, кажется точки следования отменили...
См. 1.9/13/14/15.
Более того, утечка возможна и в таком случае:
если 'lookup' выбросит исключение, поскольку порядок вычисления 'new X' и 'lookup(1)' является unsequenced. Стандарт говорит только то, что эти подвыражения должны быть "sequenced before every expression or statement in the body of the called function". Относительный порядок вычислений не определен.
Здравствуйте, saf_e, Вы писали:
_>Мне казалось что стандарт рассматривает unique_ptr<X>(new X)как монолитное выражение и не бьет его. Собственно вот про этот момент и хотелось бы почитать.