【发布时间】:2018-08-19 16:04:19
【问题描述】:
我正在尝试将 unique_ptr 移动到 WriteAsync 方法。这按预期工作。我现在遇到的问题是将唯一指针的所有权移动到strand.post lambda,然后再次将其移动到QueueMessage。
QueueMessage 接受std::unique_ptr<std::vector<char>>。
在这种情况下,对我来说最简单的方法就是使用shared_ptr。我想知道是否有办法在不使用shared_ptr 的情况下完成这项工作。
// Caller
static void DoWork( char const* p, int len )
{
client.WriteAsync( std::make_unique<std::vector<char>>( p, p + len ) );
}
// Callee
void TcpClient::WriteAsync( std::unique_ptr<std::vector<char>> buffer )
{
_strand.post( [ this, buffer = std::move( buffer ) ]( )
{
// Error on this line.
QueueMessage( std::move( buffer ) );
} );
}
void TcpClient::QueueMessage( std::unique_ptr<std::vector<char>> buffer )
{
// Do stuff
}
我看到的错误是:
您正在引用已删除的函数
【问题讨论】:
-
您遇到了“...问题...”:它们是什么,错误消息等?
-
您为什么使用
unique_ptr或vector?这看起来至少很奇怪,几乎不需要动态分配std::vector -
你得到什么错误信息,
QueueMessage的声明是什么? -
同意@UnholySheep,但是为了更好地探索所提出的问题,我们可以得到minimal reproducible example吗?制作 MCVE 将导致面部手掌并自行修复的可能性很大,但游戏正在回答问题,胜利就是胜利。
-
@WBuck A
std::vector在自身内部有一个 unique_ptr 的等价,指向它的数据,因此有一个 unique_ptr 到std::vector有点多余。您可以像使用 unique_ptr 一样std::move和std::vector。
标签: c++ c++14 unique-ptr