В вашем источнике 2 проблемы:
- вы запрашиваете память из-за
Request *request=new Request();
, которая отменяется последующим присваиванием request=&loginRequest;
(и больше не удаляется) - переменная
LoginRequest loginRequest;
разрушается, когда выполнение покидает блок {}, в котором определена переменная, в результате чего в
request
я бы предложил убрать Request *request=new Request();
строки, а затем в блоке if(...){
назначить конкретный объект LoginRequest
с помощью
LoginRequest* loginRequest = new LoginRequest();
/* fill the request */
requests.enqueue(loginRequest);
. Вы можете избавиться от объектов в очереди, удалив их вручную, когда они будут выведены из очереди (после того, как ониобрабатываются), или с помощью контейнерно-безопасного интеллектуального указателя в очереди (boost :: shared_ptr в порядке, возможно, QT также имеет один из них, std :: auto_ptr НЕ является контейнерно-безопасным ).
PITFALL Также убедитесь, что деструктор Request является виртуальным, поскольку вы не можете удалять объекты по указателю на его базовый класс, когда в базовом классе нет виртуального деструктора(с ++в этом случае можно вызвать деструктор базового класса с экземпляром производного класса, что приведет к неопределенному поведению, например утечкам памяти или сбоям)