大家好开始:
C ++中的编码
使用QT Creator版本5.4.1
当我开始用一些成员变量构建新类时,我的程序出现问题,我的程序崩溃了。我已经尝试在标题中,在类构造函数中为它们赋值,并且在类初始化中也没有帮助。这些是我认为导致问题的原因:
该类称为WfsFeatureViewer使用头文件和Qt Ui文件。 Ui在建设时初始化。
std::vector<CustomLineItem*> m_line_items;
std::vector<CustomPointItem*> m_point_items;
std::vector<CustomPolygonItem*> m_polygon_items;
它们是简单的Polygon / Line / Point项目,它们是QGraphicsPolygonItem,PointItem和行项目的子类。他们没什么。如果我将这些人排除在我的班级之外它不会崩溃(但重要的是它们是这个班级的成员变量)
我想知道我创造课程的速度是否达到了?通常我会得到大约5-60个并且它崩溃了。 WfsFeatureViewer类被添加到QListWidgetView。因此,使用循环会创建一堆循环供用户查看。这是它的外观:
// I used for index to pass the the WfsFeatureViewer
int i = 0;
// Loop for all the WFS Feature names and elements
for(auto feature_itr : m_layer_elements)
{
// Increment I per loop
i++;
// Create a new WfsFeatureViewer
auto wfs_viewer(new WfsFeatureViewer());
QObject::connect(wfs_viewer,&WfsFeatureViewer::sendNewShps,this,&DialogWfsReader::catchNewShps);
//Set some UI data and base WFS for later reading.
wfs_viewer->setElementAndName(feature_itr.first,feature_itr.second);
wfs_viewer->setIndex(i);
wfs_viewer->setWfsBaseURL(m_ui->m_line_wfs_name->text().toStdString());
// Loop to get the layer count for this wfsViewer
for(auto layer_itr : m_layer_count)
{
// check if its the correct name
if(layer_itr.first == feature_itr.first)
{
// Set the layer count
wfs_viewer->setLayerCount(layer_itr.second);
}
}
// loop to get the shape type
for(auto shp_itr : m_layer_shp_type)
{
// check if its the correct name
if(shp_itr.first == feature_itr.first)
{
// set the shape type
wfs_viewer->setShapeType(shp_itr.second);
}
}
// Create a new QListWidgetItem
QListWidgetItem* item(new QListWidgetItem);
// Add it to the QListWidget
m_ui->m_list_layers->addItem(item);
// Set the wfs_viewer onto the item
m_ui->m_list_layers->setItemWidget(item,wfs_viewer);
// Give it a size
item->setSizeHint(QSize(100,210));
// And adjust the UI
wfs_viewer->adjustSize();
}
所以这可以循环很多次,意味着很多新对象被创建,如果我加载大约70-100个类,那么大约是10-30MB的ram。
我不太清楚是什么造成这种情况,我也没有收到堆错误,所以我知道我没有杀死堆。
答案 0 :(得分:0)
好的,我现在似乎已修复它,在创建新类时停止崩溃一次。完整的Clean,QMake和rebuild解决了这个问题。不太确定导致它的原因。但是如果我找到适合这个解决方案的答案的话,它现在就会在这里发布一些内容。