删除并在同一指令中设置指针

时间:2014-10-12 00:07:53

标签: c++

有办法吗?

A* a1 = /*something*/;
A* a2 = /*something else*/;
A* tmp = a1;
a1 = a2; // both a1 and a2 points to "something else"
delete tmp; // "something" is deleted

在单个声明中首先进行设置?这样的事情:

A* a1 = /*something*/;
A* a2 = /*something else*/;
set_and_delete(a1, a2); // ok

对我来说,重要的是设置,而不是:

delete a1;
a1 = a2;

(如果需要,我可以解释原因,但似乎前面的例子足以理解这个问题)

2 个答案:

答案 0 :(得分:3)

unique_ptr这样的智能指针具有针对这种情况的成员函数:

a1.reset(a2); // assuming a2 is a raw pointer

a1 = std::move(a2); // If a2 is also a unique_ptr.

对于通常的原始指针,您必须编写适当的函数模板:

template <typename T> struct identity {using type=T;};

template <typename T>
void set_and_delete(T*& ptr, typename identity<T>::type* new_val)
{
    auto tmp = ptr;
    ptr = new_val;
    delete tmp;
}

请注意我们必须使第二个参数成为非推断的上下文,以确保不会发生演绎冲突。 cv-qualifiers仍然可以正常工作。

答案 1 :(得分:0)

你说“在同一条指令中”让我觉得你正在尝试用线程做点什么。像原子删除一样,设置为nullptr操作。

如果是这样,那么诀窍就是不要在同一时间删除和设置。技巧是原子指针更新。我相信std::atomic C ++库可以帮到你。你想要compare_exchange_strong()

创建一个设置为0的tmp变量。将要删除的指针的值复制到另一个名为pointer_expected的变量中。检查是否为0.现在将指针和tmp的值与设置为pointer_expected的预期值交换。

我相信这会导致你将指针设置为零并将指针的前一个值设置为tmp,这样就可以安全删除。如果另一个线程已经完成此操作,您将获得一个零值,该值与您的预期值不匹配,您将知道不会删除它。