Tag: 对象生命周期

函数参数的破坏顺序是什么?

如果分别用参数a_1 ,…, a_n调用types为T_1 ,…, T_n参数为p_1 ,…, p_n的函数f ,并且它的主体抛出一个exception,按照什么顺序完成或返回争论被毁,为什么? 如果可能,请提供标准参考。 编辑:我其实想问一下关于函数的“参数”,但是当TC和Columbo设法解决了我的困惑时,我将这个问题留给了参数,并且询问了一个关于参数的新的单独问题 。 请参阅关于这个问题的评论。

这个对象生命周期扩展闭包是一个C#编译器错误吗?

当我碰到C#编译器(如果有问题的话)的一些非常好奇的代码的时候,我正在回答关于closures(合法地)延长对象生命期的可能性的问题。 最短的repro我可以find如下: 在调用包含types的静态方法的同时创build一个捕获本地的lambda。 将生成的委托引用分配给包含对象的实例字段。 结果:编译器创build一个闭包对象,该闭包对象引用创buildlambda的对象,当它没有理由时 – 委托的“内部”目标是一个静态方法,并且lambda创build对象的实例成员不需要当代表执行时,(而不是)被触摸。 实际上,编译器就像程序员没有理由地捕捉到了this 。 class Foo { private Action _field; public void InstanceMethod() { var capturedVariable = Math.Pow(42, 1); _field = () => StaticMethod(capturedVariable); } private static void StaticMethod(double arg) { } } 从发布版本生成的代码(反编译为“简单”C#)看起来像这样: public void InstanceMethod() { <>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1(); CS$<>8__locals2.<>4__this = this; // What's this doing […]

为什么对于不是TriviallyCopyable的对象,std :: memcpy的行为是未定义的?

从http://en.cppreference.com/w/cpp/string/byte/memcpy : 如果对象不是TriviallyCopyable (例如标量,数组,C兼容结构),则行为是未定义的。 在我的工作中,我们已经使用std::memcpy很长时间来按位交换不是TriviallyCopyable的对象: void swapMemory(Entity* ePtr1, Entity* ePtr2) { static const int size = sizeof(Entity); char swapBuffer[size]; memcpy(swapBuffer, ePtr1, size); memcpy(ePtr1, ePtr2, size); memcpy(ePtr2, swapBuffer, size); } 从来没有任何问题。 我明白,滥用std::memcpy与非TriviallyCopyable对象并导致下游未定义的行为是微不足道的。 不过,我的问题是: 为什么在使用非TriviallyCopyable对象时, std::memcpy本身的行为是未定义的? 为什么标准认为有必要指定? UPDATE http://en.cppreference.com/w/cpp/string/byte/memcpy的内容已经被修改,以回应这个post和post的答案。 目前的描述说: 如果对象不是TriviallyCopyable (例如标量,数组,C兼容结构),则行为是不确定的,除非程序不依赖于目标对象(不由memcpy运行)的析构函数的效果以及目标对象(已结束,但未由memcpy启动)通过其他方式启动,如placement-new。 PS 评论者@Cubbi: @RSahu如果有东西保证UB下游,它呈现整个程序未定义。 但我同意,在这种情况下,似乎有可能绕过UB,并相应地修改相关的参考。