如何修复C++ scalar deleting destructor相关LNK2019/1120错误
错误根因
LNK2019与后续的LNK1120链接错误的触发原因非常明确:你在graphapp.h中为GraphApp类声明了虚析构函数~GraphApp();,但在对应的graphapp.cpp实现文件中没有编写该析构函数的具体实现,链接器无法找到该函数的二进制实体,就会抛出无法解析外部符号的报错。
直接修复方案
在graphapp.cpp中补全析构函数的实现即可解决链接错误,同时在析构函数中做好资源释放避免内存泄漏,参考实现:
GraphApp::~GraphApp() { // 停止并释放定时器资源 if (graph_timer) { graph_timer->stop(); delete graph_timer; } // 释放UI对象 delete ui; }
代码中其他会导致运行异常的隐患
补全析构函数仅能解决编译链接问题,你现有代码还有多处逻辑错误,运行时大概率崩溃或功能异常,需要一并修正:
- 构造函数中
QList <float> storedData = *new QList<float>;是错误写法:类中已经定义了同名成员变量storedData,这行代码会创建一个同名局部变量遮蔽成员变量;同时*new QList<float>会在堆上创建匿名对象,拷贝给局部变量后堆内存永远无法释放,造成内存泄漏,直接删除这行代码即可,成员变量会随对象构造自动初始化。 - 信号槽连接存在签名不匹配问题:
- 按钮
clicked()信号无参数,但你连接的dataExport槽要求传入QList<float>参数,点击按钮时会因为参数不匹配触发崩溃。修改dataExport为无参函数,内部直接读取类成员storedData导出即可。 - 定时器
timeout()信号无参数,但你连接的dataSave槽要求传入float参数,定时器触发时会直接崩溃,需要调整dataSave逻辑,改为从业务逻辑处获取待保存数据,不要依赖信号传不存在的参数。
- 按钮
dataSave函数中ui->tableWidget->insertRow(convData);逻辑错误:insertRow的参数是待插入的行索引,你传入采集到的float数据作为索引,一旦数据值超过当前表格行数就会触发越界崩溃。正确写法是先获取当前表格总行数作为新行索引,再插入行:int newRow = ui->tableWidget->rowCount(); ui->tableWidget->insertRow(newRow);- 导出CSV文件时直接写入
"\n"作为换行符,在Windows环境下用Excel打开导出的文件时会出现所有内容挤在同一行的问题,替换为"\r\n"即可兼容。
内容的提问来源于stack exchange,提问作者user19377312
相关产品推荐
相关产品推荐

