Не могу создать список серверов

Я пытаюсь создать сервер, используя qttcpserver.
Мой код был написан для этого пример. Разница лишь в том, что я также использовал пул потоков. У меня есть форма, на которой есть две кнопки. Первая кнопка создает объект моего класса сервера, а вторая удаляет. Как понятно кнопки отвечают за включение и выключение сервера. Я хочу запустить сервер на разных портах. Итак, мне нужно создать несколько объектов класса на моем сервере и передать их в качестве параметра конструктору нужного порта.

Чтобы лучше понять код моих кнопок.

class FormServer {
...
private:
MyServer * server;
public:
void start() {
server = new MyServer();
}
void stop() {
delete server;
}
}

Это пример примера, когда я запускаю сервер на одном порту. Вот пример для разных портов.

class FormServer {
...
private:
QList<unsigned> ports;
QVector<MyServer *> server;
public:
void start() {
for(auto i = ports.begin(); i != ports.end(); i++) {
server.push_back(new MyServer(*i)); //port passed as a parameter
}
}
void stop() {
for(auto i = server.begin(); i != server.end(); i++) {
delete *i;
}
}
}

В первом примере все отлично работает. Секунда имеет большую проблему. Вот пример проблемы.

start(); //ok
stop(); //ok
start(); //ok
stop(); //error

Наблюдая за отладкой и увидев, что в строке происходят ошибки, удалите * i (необработанное исключение в 0x01033862 в server.exe: 0xC0000005: адрес чтения нарушения доступа 0x0000000C.)

Тогда почему это происходит только тогда, когда функция вызывается второй остановкой, и сначала все нормально?

Пожалуйста, помогите мне решить проблему.

P.S Извините, это не полный пример кода, потому что он очень большой, и разобрать его будет очень сложно. Также извините за мой английский.

2

Решение

У вас есть две проблемы, одна из которых тонкая, но все же:

  • Вы сами пишете алгоритм удаления элементов, а не используете qDeleteAll, Лучше не изобретать велосипед.

  • Вы не удаляете элементы из контейнера, просто удалите их.

Поэтому я бы написал что-то вроде этого на вашем месте:

#include <QtAlgorithms>

...

void stop() {
qDeleteAll(server);
server.clear();
}

Пожалуйста, проверьте Документация по QtAlgorithms для деталей.

0

Другие решения


По вопросам рекламы [email protected]