2016-12-12 3 views
0

У меня есть проблема с использованием QLocalServer/QLocalSocket.Утечка памяти в QLocalServer/QLocalSocket

Я отправляю необработанные пиксельные данные с сервера на клиент, и во время процесса происходит большая утечка памяти. но я не мог знать, что является причиной ... увеличение

памяти о 20MB/1сек (когда я проверил с моими глазами системного администратора.)

Подписок мои коды.

Сервер

void qsharedServer::updateImageData(unsigned char* r_data, int r_width, int r_height, int r_step, int r_label_i){ 

QLocalSocket* connection = 0; 
connection = clientSocket; 

if (connection) 
{ 
    if (connection->isOpen()) 
    { 
     QByteArray block; 
     QDataStream out(&block, QIODevice::WriteOnly); 

     out.setVersion(QDataStream::Qt_5_7); 
     const char* rc_data = reinterpret_cast<const char*>(r_data); 

     out <<r_step*r_height<< r_width << r_height << r_step; 
     out.writeBytes(rc_data, r_step*r_height); 
     connection->write(block); 
     connection->flush(); 
    } 
} 

Client

void qsharedClient::readSocket(){ 

    QByteArray block = connection->readAll(); 
    QDataStream in(&block, QIODevice::ReadOnly); 
    in.setVersion(QDataStream::Qt_5_7); 

    /* Read Raw Data */ 
    char* data; 
    uint size; 
    int width; 
    int height; 
    int step; 
    while (!in.atEnd()) 
    { 
     in >> size >> width >> height >> step; 
     in.readBytes(data, size); 
    } 
    emit drawData((unsigned char*)data, width, height, step); 
} 

Эти два кода могут хорошо общаться, но воспоминания очень резко возрастает, и заканчивается, когда его на определенном уровне.

Я пробовал как подключение-> reset() или QByteArray :: clear() .. и т. Д., но это не сработало.

Есть ли идеи с моей проблемой ??

Как насчет использования QTcpServer/QTcpSocket ?? Это может решить мою проблему ??

Пожалуйста, поделитесь своей идеей. Благодаря!!

+0

'in.readBytes' выделяет память. Где вы его освобождаете? – peppe

+0

Возможный дубликат [Как я могу очистить QLocalSocket?] (Http://stackoverflow.com/questions/41053457/how-can-i-clear-qlocalsocket) – ElDorado

ответ

0

Это должно происходить, потому что именованный канал хранит все данные, пока вы его не закроете. В качестве решения вы должны позвонить disconnectFromServer() для сокета (на стороне отправителя или получателя - не имеет значения), как только вы отправили/получили достаточно данных для одного пакета.