有没有更好的方法来分配/复制 shared_array

Posted

技术标签:

【中文标题】有没有更好的方法来分配/复制 shared_array【英文标题】:Is there a better way of allocating/copying shared_array 【发布时间】:2013-04-02 23:38:18 【问题描述】:

我有一个提供GetBuffer()GetBufferSize() 方法的流对象。 GetBuffer 方法返回一个原始的 uint8_t 指针。我想将此缓冲区(按值)传递给另一个需要shared_array<uint8_t> 的对象。我正在使用 boost,(我对它还很陌生),这就是我想出的。

// relevant protos for a and b
void BClass::SetData(shared_array<uint8_t> data, size_t data_len);
uint8_t* AClass::GetBuffer(void);
size_t AClass::GetBufferSize(void);

AClass a;
BClass b;

shared_array<uint8_t> data = shared_array<uint8_t>(new uint8_t[a.GetBufferSize()]);
memcpy(data.get(), a.GetBuffer(), a.GetBufferSize());
b.SetData(data, a.GetBufferSize());

感觉应该有类似于 boost 的 make_shared 的东西可以解决这个问题。我错过了什么明显的东西吗?

【问题讨论】:

【参考方案1】:

Boost 1.53we've got make_shared for arrays。所以你的代码可能看起来像这样:

shared_ptr<uint8_t[]> data = make_shared<uint8_t[]>(a.GetBufferSize());

当然,那么您需要更改BClass::SetData 签名,以接受shared_ptr 而不是shared_array

【讨论】:

这删除了对 new 的调用,但 memcpy 仍然需要单独完成。另外,shared_ptr 中的数组在 1.53 中不是新的吗? IIRC,我们使用的是 Boost 1.33 @benf 是的,这是 boost1.53 中的一个新特性。至于memcpy,可以用std::copy,不过这种情况下没关系。

以上是关于有没有更好的方法来分配/复制 shared_array的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来为 MySQL 中的临时表分配权限?

有没有更好的方法来创建“抽象”线性搜索? [复制]

如何在 Swift 2.0 中检查 UITextField 是不是为空白?有没有更好的方法来计算字符串? [复制]

有没有更好的方法来确定大 txt 文件(1-2 GB)中的行数? [复制]

有没有更好的方法来反映用户端更改的 CSS 代码,而不是告诉他们请清除缓存以查看更新? [复制]

有没有更好的方法在 Java 中进行空检查? [复制]