Я пытаюсь создать сервер, используя 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 Извините, это не полный пример кода, потому что он очень большой, и разобрать его будет очень сложно. Также извините за мой английский.
У вас есть две проблемы, одна из которых тонкая, но все же:
Вы сами пишете алгоритм удаления элементов, а не используете qDeleteAll
, Лучше не изобретать велосипед.
Вы не удаляете элементы из контейнера, просто удалите их.
Поэтому я бы написал что-то вроде этого на вашем месте:
#include <QtAlgorithms>
...
void stop() {
qDeleteAll(server);
server.clear();
}
Пожалуйста, проверьте Документация по QtAlgorithms для деталей.