我正在尝试使用qttcpserver创建服务器。 我的代码是为此example编写的。唯一的区别是我也使用了线程池。我有一个表格,上面有两个按钮。第一个按钮创建我的类服务器的对象,第二个按钮删除。清楚按钮负责打开和关闭服务器。我想在不同的端口上运行服务器。所以,我需要在我的服务器上创建多个类对象,并作为参数传递给所需端口的构造函数。
让您更好地了解我的按钮代码。
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(server.exe中0x01033862处的未处理异常:0xC0000005:访问冲突读取地址0x0000000C。)
那么为什么只有当函数被称为第二站时才会出现,并且最初一切都很好?
请帮我解决问题。
P.S抱歉,这不是一个完整的示例代码,因为它非常大并且解析起来非常困难。也很抱歉我的英文。
答案 0 :(得分:0)
这里有两个问题,其中一个是微妙的,但仍然是:
您正在为元素自己编写删除算法,而不是使用qDeleteAll
。最好不要重新发明轮子。
您没有从容器中删除元素,只需将其删除即可。
因此,如果我是你,我会写这样的东西:
#include <QtAlgorithms>
...
void stop() {
qDeleteAll(server);
server.clear();
}
请查看QtAlgorithms documentation了解详情。