在这种特定情况下使用unique_ptr的char数组

时间:2017-04-27 19:23:38

标签: c++ c++11 unique-ptr

我目前正在使用C ++中的套接字工作。

我有一个发送字符串的函数:

void SocketServer::SendData(int id_client, const std::string &str)
{
  int size = str.size();
  send(id_client, &size, 4, 0);
  send(id_client, str.c_str(), str.size(), 0);
}

首先,我发送4个字节,对应于我想发送的字符串的长度。

然后,我有一个接收字符串的函数:

int SocketServer::ReceiveData(int id_client)
{
  char  buffer[1024]; // <<< this line, bad idea, I want to use unique_ptr
  int size = 0;
  int ret = 0;

  ret = recv(id_client, &size, 4, 0);  //<<< Now I know the length of the string I will get

  if (ret >= 0)
  {
    ret = recv(id_client, buffer, size, 0);
    if (ret >= 0)
    {
      buffer[ret] = '\0';
      std::cout << "Received: " << buffer << std::endl;
    }
  }
  return (ret);
}

我不想使用固定缓冲区,我想使用unique_ptr(因为它是尊重RAII的好方法)

我怎么能这样做?

非常感谢

1 个答案:

答案 0 :(得分:5)

您可以改为使用std::string

std::string buffer;
int size = 0;                                                                                          
int ret = 0;                                                                                           

ret = recv(id_client, &size, 4, 0);
buffer.resize(size);

//later..
recv(id_client, &buffer[0], size, 0);             

buffer现在将包含收到的数据和正确的大小。由于RAII,它也将被销毁。