使用 boost 侵入式指针初始化数组的最时尚方式

Posted

技术标签:

【中文标题】使用 boost 侵入式指针初始化数组的最时尚方式【英文标题】:most STLish way to init array with boost intrusive pointers 【发布时间】:2013-12-25 18:01:05 【问题描述】:

我有这个:

struct Node;
typedef boost::intrusive_ptr<Node> NodeSPtr;

...

boost::scoped_array<NodeSPtr> nodes(new NodeSPtr[size]);

...

// "pollute" operations ...

...

// reset all the items in the array
for (size_t i = 0; i < size; ++i)
    nodes[i].reset();

什么是初始化数组的最干净、更 STLish 的方法。请注意,代码对性能敏感,不能选择使用向量。

【问题讨论】:

我不完全确定你想要什么。您似乎只想重置scoped_arrayboost::scoped_array中有一个Reset()函数。 scoped_array 重置会释放数组中的所有项目,但不会重置它们 【参考方案1】:

intrusive_ptr 的默认构造函数根据docs 有一个 get() == 0 的后置条件。因此,要默认构造数组值,只需在 new 之后粘贴一对花括号(统一初始化),如下所示:

boost::scoped_array<NodeSPtr> nodes(new NodeSPtr[size]);

如果不能使用统一初始化语法,也可以使用括号。

【讨论】:

初始初始化没问题。问题是在其他点将数组重置为 NULL 指针 我明白了,除了你已经说过的for 循环之外,我认为没有真正的好方法可以做到这一点。如果您希望它看起来更好一点,也可以尝试std::fill_n 或其他东西。

以上是关于使用 boost 侵入式指针初始化数组的最时尚方式的主要内容,如果未能解决你的问题,请参考以下文章

非侵入式获取Context进行SDK初始化

第六章:侵入式服务治理

如何实现避免未定义行为的侵入式链表?

boost::variant 隐式转换为字符串

Spring 侵入式和非侵入式

侵入式单链表的简单实现