как скопировать данные в буфер? - PullRequest
2 голосов
/ 17 июня 2011

Я работаю над сетевым программированием с использованием epoll, и у меня есть этот код.

            int str_len = read(m_events[i].data.fd, buf, BUF_SIZE);
            printf("read %d \n", str_len);

            if(str_len == 0){
                if(!removeClient(m_events[i].data.fd))
                    break;
                close(m_events[i].data.fd);

            }
            else {
                printf("ServerManager::eventAcceptLoop, A message has been received \n");
                pushWork(buf);
            }

buf объявлен так

buf[BUF_SIZE];

и я хочу передать данные в буфере в функцию "pushWork"

 pushWork(char * pdata){
      hand this pdata to the thread pool to parse and handle it
 }

Я думаю, что мне нужно скопировать данные в буфере вместо того, чтобы указывать на буф, потому что они будут перезаписаны всякий раз, когда поступают новые данные. Сейчас я делаю что-то вроде

 char *pdata = buf;
 pushWork(pdata)

Должен ли я делать мемкопию или что-то еще? и очистить буф? Пожалуйста, дайте мне знать, как я могу справиться с этим. Заранее спасибо ...

1 Ответ

1 голос
/ 17 июня 2011

Да, вы можете скопировать данные:

char* pdata = new char[str_len];
memcpy(pdata, buf, str_len);
pushWork(pdata);

В конце pushWork он должен позаботиться об освобождении данных, когда это будет сделано:

delete[] pdata;

Вы также можете рассмотреть возможность инкапсуляции всего этого в std::vector, поэтому вам не нужно беспокоиться о безопасности исключений:

std::vector<char> data(buf, buf + str_len);
pushWork(data);

В этом случае необходимо изменить pushWork, чтобы получить std::vector по значению , но положительным моментом является то, что ему не придется беспокоиться об удалении данных после завершения, и он будет полностью безопасен для исключений.

...