Безопасно ли это для .pop_back () от std :: вектор, чтобы избежать указателей/сдвига памяти?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Безопасно ли это для .pop_back () от std :: вектор, чтобы избежать указателей/сдвига памяти?

Сообщение Anonymous »

У меня есть эта ситуация: < /p>

Код: Выделить всё

class Socket
{
[...]
pollfd* fdPtr;
}
И у меня есть класс менеджера, который создает фактические объекты Pollfd и добавляет их к std :: vector pollfdsVec , а затем опрашиваться на них. Между тем, сами сокеты хранятся в другом std :: vector socketsvec .
Когда создается (принимается (принимается), FDPTR установлен:

Код: Выделить всё

class Manager
{
std::vector
 pollFdsVec
std::vector socketsVec;

void Accept()
{
// When a new connection is created
std::shared_ptr sock = Accept(...); // listener returns a sharedptr
socketsVec.push_back(sock);

// Add the new connection to the pfds
pollfd newPfd;
[...]
m_pollFdsVec.push_back(newPfd);

// Set the pointer
sock->fdPtr = &pollFdsVec[pollFdsVec.size() - 1]
}

void Poll()
{
int res = poll(pollFdsVec);

[...]
}
};
Это работает хорошо, потому что я обязательно назвал pollfdsvec.reserve (max_clients_conected) во время инициализации и потому что я никогда не буду называть push_back в векторе, если зарезервированный размер достигнут, так что перемещение не может произойти. упал, и с этим текущим дизайном я столкнулся с проблемой, где после pollfdsvec.erase () все остальные FDPTR теряют значение. Как ни странно, я не получаю аварию, но я считаю, что проблемы, которые я получаю впоследствии от удаления, исходят из этого.

Код: Выделить всё

if (toRemove.size() > 0)
{
// Remove socket from list and fds, in reverse order to avoid index shift
std::sort(toRemove.begin(), toRemove.end(), std::greater());
for (int idx : toRemove)
{
std::swap(pollFdsVec[idx], pollFdsVec.back());
std::swap(socketsVec[idx], socketsVec.back());

// Update the socket that was sitting at the back and suffered the swap
socketsVec[idx]->SetPfd(&m_poll_fds[idx]);

m_poll_fds.pop_back();
m_list.pop_back();
}
}
Но я впервые делаю что -то подобное, и, хотя кажется, что мне кажется, я задаюсь вопросом, на самом деле это безопасно, и если некоторые из вас более опытных разработчиков когда -либо видели ситуации, когда это может привести к потенциальной проблеме в будущем.
Этот цикл объединения случается в одном потоке, и да, я нуждаюсь в том, чтобы узнать, что я могу подать в опрос. События.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... ers-memory
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Безопасно ли это для .pop_back () от std :: вектор, чтобы избежать указателей/сдвига памяти?
    Anonymous » » в форуме C++
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Html таблица строка/сдвига столбца Сдвига One Up One Up
    Anonymous » » в форуме Html
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Html таблица строка/сдвига столбца Сдвига One Up One Up
    Anonymous » » в форуме Html
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Html таблица строка/сдвига столбца Сдвига One Up One Up
    Anonymous » » в форуме Html
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Html таблица строка/сдвига столбца Сдвига One Up One Up
    Anonymous » » в форуме Html
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»