【问题标题】:I can not create a list of servers我无法创建服务器列表
【发布时间】:2014-06-04 23:03:24
【问题描述】:

我正在尝试使用 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

看调试,发现连续出错 delete *i(server.exe中0x01033862处未处理异常:0xC0000005:访问冲突读取地址0x0000000C。)

那为什么只有在调用第二个stop的时候才会出现,一开始一切正常?

请帮我解决问题。

P.S 抱歉,这不是一个完整的示例代码,因为它非常大并且解析起来非常困难。也对不起我的英语。

【问题讨论】:

  • 在删除集合后删除所有条目可能是个好主意。
  • @JoachimPileborg,我不明白你的意思。函数 start() 创建一个新的开始。
  • start 函数所做的只是push_back,即它只是添加到集合中。
  • @user3554824 如果您想清除来自server 的所有条目,您需要调用server.clear();delete 与指针是否为向量中的条目无关。
  • 什么删除?在您提供的代码中,任何地方的 server 向量都有 no 删除。当您 delete 只破坏指向的对象的指针时,它什么也不做,最重要的是从任何集合中删除指针。

标签: c++ qt qtcore qtnetwork qtcpserver


【解决方案1】:

这里有两个问题,其中一个很微妙,但仍然:

  • 您正在为元素自己编写删除算法,而不是使用qDeleteAll。最好不要重新发明轮子。

  • 您并没有从容器中删除元素,只是删除它们。

因此,如果我是你,我会写这样的东西:

#include <QtAlgorithms>

...

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

详情请查看QtAlgorithms documentation

【讨论】:

    猜你喜欢
    • 2019-02-03
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2020-01-18
    • 2014-09-16
    • 2022-01-15
    相关资源
    最近更新 更多