2017-04-21 52 views
0

我有变量buff,它有overloaded = operator。 这个变量在lambda中被使用并且被指针传递。 当我想用这个操作符,我会做:在指针上执行运算符而不会解除引用

*buf=CreateBuffer(w, h, type, c); 

然而,它取消引用指针和析构函数被调用时的范围不应该发生的结束。

所以要防止析构函数的调用我做的:

buf->operator=(CreateBuffer(w, h, type, c)); 

有没有其他的通常惯例,实现=运算符没有这个长的版本?

+1

'CreateBuffer'是否按照值返回任何类型的'* buf'?然后,你不能真正阻止析构函数被调用,因为'CreateBuffer'的返回创建了一个需要在两种情况下都被破坏的临时对象。我真的怀疑这是你的*根*问题,也许如果你给出更多的细节*为什么*你不希望析构函数被调用我们可以帮助你更好?你有什么*实际*问题?你有没有遇到问题,因为你没有遵循[三,五或零的规则](http://en.cppreference.com/w/cpp/language/rule_of_three)? –

+0

如果'buf'是一个常规指针,那么这些指针完全相同。 (都是'(* buf).operator =(CreateBuffer(w,h,type,c));'。)请发布相关代码而不是描述它。 – molbdnilo

回答

1

上指针执行操作

您的运营商不超载的指针,但对于尖头型。因此你不能“在指针上执行操作符”。要在指出的对象上执行操作符,您必须使用*->对指针取消引用。

但是它的引用指针和析构函数在范围的末尾被调用,不应该发生。

解引用指针不会导致析构函数被调用,除非你有operator*一个奇怪的过载(你不能有,如果buf是一种原始的指针,而不是包装类)。

我怀疑,你正在观察一个临时的析构函数,即由于从CreateBuffer创建转化成decltype(*buf),虽然这是不可能的,以确保没有mcve