Qt释放内存

时间:2016-02-03 16:05:30

标签: c++ qt free

我在Qt中编写了一个使用动态内存分配的C ++程序,并确保在最后包含free()调用。但是,当程序到达自由语句时,它会崩溃。 (我知道这是因为我添加的测试从未在免费声明后打印)无论如何,这里是代码:

#include <QCoreApplication>
#include <QSerialPort>
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <Windows.h>
using namespace std;

int main(int argc, char *argv[])
{

QSerialPort serial0;
//serial.open(serial);

serial0.setBaudRate(QSerialPort::Baud9600);
serial0.setDataBits(QSerialPort::Data8);
serial0.setParity(QSerialPort::NoParity);
serial0.setStopBits(QSerialPort::OneStop);
serial0.setFlowControl(QSerialPort::NoFlowControl);

char *com="com";
int number;
char *comPlusNumber;

comPlusNumber=(char*) malloc(8*sizeof(char));

int j=10000;
while(j>0)
{
    number=j;
    sprintf(comPlusNumber, "%s%d",com,number);
    //printf("%s \n",comPlusNumber);

    serial0.setPortName(comPlusNumber);
    serial0.open(QIODevice::ReadWrite);

    if(serial0.isOpen()==true)
    {
        printf("YES*****************");
        printf("%s \n",comPlusNumber);
    }
    else
        //printf("No %d\n", number);

    serial0.close();
    j--;
}


free(com);
free(comPlusNumber);

printf("\n\n Test");
//QCoreApplication a(argc, argv);

//return a.exec();
}

我只是想确保我没有造成内存泄漏。

2 个答案:

答案 0 :(得分:1)

使用框架。你有Qt的力量!

有几个问题:

  1. C风格的字符串操作是不必要和错误的。使用QString

    auto name = QStringLiteral("COM%1").arg(i);
    
  2. 如果没有QCoreApplication实例,则无法使用串口。

  3. 您不应通过迭代您认为可能有效的端口来测试端口的存在。这是不便携的,也是不必要的。获取要开始的端口列表。

  4. 因此:

    // https://github.com/KubaO/stackoverflown/tree/master/questions/simple-serial-35181906
    #include <QtCore>
    #include <QtSerialPort>
    
    int main(int argc, char ** argv) {
       QCoreApplication app{argc, argv};
       QSerialPort serial;
       serial.setBaudRate(QSerialPort::Baud9600);
       serial.setDataBits(QSerialPort::Data8);
       serial.setParity(QSerialPort::NoParity);
       serial.setStopBits(QSerialPort::OneStop);
       serial.setFlowControl(QSerialPort::NoFlowControl);
    
       for (auto port : QSerialPortInfo::availablePorts()) {
          serial.setPort(port);
          serial.open(QIODevice::ReadWrite);
          if (serial.isOpen()) {
             qDebug() << "port" << port.portName() << "is open";
             serial.close();
          } else
             qDebug() << "port" << port.portName() << "couldn't be opened";
       }
    }
    

    这是我机器上的输出:

    port "cu.serial1" is open
    port "cu.usbserial-FTELA9I5" is open
    port "cu.usbserial-PX9A3C3B" is open
    

答案 1 :(得分:0)

您只能释放动态分配的内容。您从未为com动态分配任何内容,因此将其传递给free是一个错误。它相当于试图释放字符串常量的free("com");