gpt4 book ai didi

c++ - 多态队列

转载 作者:行者123 更新时间:2023-11-30 01:00:30 25 4
gpt4 key购买 nike

我正在尝试实现一个多态队列。这是我的试用版:

QQueue <Request *> requests;

while(...)
{
QString line = QString::fromUtf8(client->readLine()).trimmed();

if(...)){
Request *request=new Request();
request->tcpMessage=line.toUtf8();
request->decodeFromTcpMessage(); //this initialize variables in request using tcpMessage
if(request->requestType==REQUEST_LOGIN){
LoginRequest loginRequest;
request=&loginRequest;
request->tcpMessage=line.toUtf8();
request->decodeFromTcpMessage();
requests.enqueue(request);
}
//Here pointers in "requests" do not point to objects I created above, and I noticed that their destructors are also called.
LoginRequest *loginRequest2=dynamic_cast<LoginRequest *>(requests.dequeue());
loginRequest2->decodeFromTcpMessage();
}
}

不幸的是,由于我在第二条评论中提到的原因,我无法使用这段代码使多态队列工作。我想,我需要使用智能指针,但是如何呢?我对我的代码的任何改进或多态队列的新实现持开放态度。

谢谢。

最佳答案

你的源代码有两个问题:

  • 您通过 Request *request=new Request(); 申请内存,它被后面的 request=&loginRequest; 分配放弃(并且不再可删除)
  • LoginRequest loginRequest; 变量在执行离开定义变量的 {} block 时被破坏,导致 中出现悬空指针
    请求

我建议删除 Request *request=new Request(); 行,然后在 if(...){ block 中分配具体的 LoginRequest 对象由

LoginRequest* loginRequest = new LoginRequest();/* fill the request */requests.enqueue(loginRequest);

您可以通过在对象从队列中弹出时(在它们被处理后)手动删除它们来摆脱排队的对象,或者通过在队列中使用容器安全的智能指针(提升::shared_ptr 很好,也许 QT 也有其中之一,std::auto_ptr 不是容器安全的)。

陷阱 还要确保 Request 的析构函数是虚拟的,因为当基类中没有虚拟析构函数时,您不能通过指向其基类的指针删除对象(c++ 可以调用基类在这种情况下,具有派生类实例的类析构函数,导致未定义的行为,如内存泄漏或崩溃)

关于c++ - 多态队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2598723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com