PDA

View Full Version : Program crashes on 64-bit systems



WereWind
4th February 2013, 21:19
Hello everybody. I'm writing a rather simple program on Qt. While I was working on 32-bit Ubuntu everything worked fine but when I tried to run the code under 64-bit Ubuntu it crashes with SIGABRT. Here's the simplified code that shares the same problems. it's your basic QTableWidget-based file manager

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <stdhdr.h>
class BrowserTable;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
BrowserTable *m_pBrowserTable;
};

#endif // MAINWINDOW_H

mainwindow.cpp


#include <stdhdr.h>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

m_pBrowserTable = new BrowserTable(this, ui, "/");


}

MainWindow::~MainWindow()
{
delete m_pBrowserTable;
if(ui)
delete ui;
}

browsertable.h

#ifndef BROWSERTABLE_H
#define BROWSERTABLE_H

#include "stdhdr.h"

class MainWindow;
class BrowserTable : public QObject
{
Q_OBJECT
public:
explicit BrowserTable(MainWindow *pMainWindow, Ui::MainWindow *pui, QString top_level, QObject *parent = 0);
void SetupTable();
~BrowserTable();

public slots:
void FillTableAsTable(QString);

private:
Ui::MainWindow *ui;
MainWindow *m_pMainWindow;

};

#endif // BROWSERTABLE_H

browsertable.cpp

#include "browsertable.h"

BrowserTable::BrowserTable(MainWindow *pMainWindow, Ui::MainWindow *pui, QString top_level, QObject *parent) :
QObject(parent)
{
ui =pui;
m_pMainWindow=pMainWindow;

SetupTable();
}

BrowserTable::~BrowserTable()
{

}

void BrowserTable::SetupTable()
{
ui->table_browser->setColumnCount(4);*
QHeaderView *headerView = ui->table_browser->horizontalHeader();
headerView->setResizeMode(1, QHeaderView::Stretch);
headerView->setResizeMode(0, QHeaderView::Fixed);
headerView->setResizeMode(2, QHeaderView::Fixed);
headerView->setClickable(false);

QTableWidgetItem *h_item1 = new QTableWidgetItem(" ");

QTableWidgetItem *h_item2 = new QTableWidgetItem("Name");
QTableWidgetItem *h_item3 = new QTableWidgetItem("Type");
QTableWidgetItem *h_item4 = new QTableWidgetItem("Size");
ui->table_browser->setHorizontalHeaderItem(0, h_item1);
ui->table_browser->setHorizontalHeaderItem(1, h_item2);
ui->table_browser->setHorizontalHeaderItem(2, h_item3);
ui->table_browser->setHorizontalHeaderItem(3, h_item4);
ui->table_browser->horizontalHeader()->setVisible(true);
ui->table_browser->verticalHeader()->setVisible(false);
ui->table_browser->setColumnWidth(0, 20);
ui->table_browser->setShowGrid(false);

ui->table_browser->setSelectionMode(QAbstractItemView::SingleSelectio n);
ui->table_browser->setSelectionBehavior(QAbstractItemView::SelectRows );

FillTableAsTable("/");
}

void BrowserTable::FillTableAsTable(QString path)
{
ui->table_browser->setHidden(false);
QDir current_dir(path);

QFileInfoList file_list = current_dir.entryInfoList();
if (file_list.count()==0)
{
return;
}

ui->table_browser->clear();
ui->table_browser->setRowCount(file_list.count());

for (int i=0; i<file_list.count(); i++)
{
QFileIconProvider *prov = new QFileIconProvider();
QIcon myicon = prov->icon(file_list.at(i));

QTableWidgetItem *item1 = new QTableWidgetItem();
QTableWidgetItem *item2 = new QTableWidgetItem();
QTableWidgetItem *item3 = new QTableWidgetItem();
QTableWidgetItem *item4 = new QTableWidgetItem();

item1->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled|Qt ::ItemIsUserCheckable);
item1->setIcon(myicon);
item3->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);

ui->table_browser->setItem(i, 1, item1);
ui->table_browser->setItem(i, 0, item2);
ui->table_browser->setItem(i, 2, item3);
ui->table_browser->setItem(i, 3, item4);

}
}

The problem seems to be with the ui pointer in the Browsertable but I have no idea how to fix the issue while keeping the same class structure. Any hel would be appreciated.

Santosh Reddy
4th February 2013, 21:54
Which line does it crash?

BTW there is an extra '*' at browsertable.cpp#19 (I guess copy paste thing)

WereWind
5th February 2013, 07:50
Which line does it crash?

It crashes basically everywhere. In this particular code it does so in line 63 of browsertable.cpp after several iterations. If I comment this line it crashes in line 57. If I completeely comment FillTableAsTable function call then it crashes in mainwindow.cpp in the destructor if I remove ui existance check.


BTW there is an extra '*' at browsertable.cpp#19 (I guess copy paste thing)
Yes, it is. Unfortunately it's too late for me to edit

Santosh Reddy
5th February 2013, 08:20
Does it crash even if you step the complete code?

Just another observation, add a "delete prov", in the for loop;

WereWind
5th February 2013, 08:47
Does it crash even if you step the complete code?
Well it is a complete code, it misses only main.cpp which is generic and stdhdr.h which only has various includes. If by the complete code you mean the main program I'm doing than it crashes in a somewhat different place but with the same syptoms.
And if by step you mean pressing f10 (sorry, I'm pretty new to programmers' forums) then yes, it does. It gives me munmap_chunk(): invalid pointer error if that helps


"delete prov", in the for loop
Good idea. It didn't solve the problem but thanks

Santosh Reddy
5th February 2013, 09:52
Good idea. It didn't solve the problem but thanks
It was not to solve the crash problem, It was just to avoid memory leak :)

One last thing which I can suggest is, Make sure you Clean All, and Rebuild the code a fresh. (I insist make sure you are using correct file paths to build)

WereWind
5th February 2013, 10:29
One last thing which I can suggest is, Make sure you Clean All, and Rebuild the code a fresh. (I insist make sure you are using correct file paths to build)

Just did that. still the same crash. Well, thanks for the help anyway.
PS. If I upload the whole project here, can anybody test it on their own 64-bit system? Maybe it's something on my end after all