Mainwindow closes when I close PCL window.
-
I m using Qt 5.9.9 with PCL 1.10. in Ubuntu 20.04. I m trying to visualise a point cloud data with click of a button. I m able to do that but once I close the cloud viewer the main window also closes.
Following error appears on output screen:12:43:07: Starting /home/suraj/PCL_Project/build-Qt_PCL_integration-Desktop_Qt_5_9_9_GCC_64bit-Debug/Qt_PCL_integration ... terminate called after throwing an instance of 'std::system_error' what(): Invalid argument 12:43:13: The program has unexpectedly finished. 12:43:13: The process was ended forcefully. 12:43:13: /home/suraj/PCL_Project/build-Qt_PCL_integration-Desktop_Qt_5_9_9_GCC_64bit-Debug/Qt_PCL_integration crashed.
I have uploaded code and pcd file here.
Any suggestion on this? -
@surajj4837 said in Mainwindow closes when I close PCL window.:
Any suggestion on this?
No, not enough information.
Please run your app through debugger (first thing to do in such situations) and post the stack trace after crash. -
-
jsulm Lifetime Qt Championreplied to surajj4837 on 3 May 2021, 07:57 last edited by jsulm 5 Mar 2021, 07:58
@surajj4837 said in Mainwindow closes when I close PCL window.:
viewer.~CloudViewer();
?
This is not how destructors are usually called in C++.
It has to bedelete viewer;
Is viewer actually allocated on the stack? Please show relevant code.
Also, does viewer have a parent set?
And you still did not post the stack trace. -
-
@surajj4837 Please show the code where you're using viewer and answer my other questions. viewer seems to be allocated on the stack, so no need to delete it (even less so calling the destrcutor directly)!
-
@jsulm when I write viewer. it provides a list of inbuilt functions which also has the destructor in it. So I called it that way.
-
@surajj4837
Yes.So what does line #55 of your
MainWindow::on_pushButton_clicked
do? Looks like there is a clue about destructing aCloudViewer
? -
void MainWindow::on_pushButton_clicked() { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile ("000000.pcd", *cloud); pcl::visualization::CloudViewer viewer("Cloud Viewer"); //blocks until the cloud is actually rendered viewer.showCloud(cloud); //use the following functions to get access to the underlying more advanced/powerful //PCLVisualizer //This will only get called once viewer.runOnVisualizationThreadOnce (viewerOneOff); //This will get called once per visualization iteration viewer.runOnVisualizationThread (viewerPsycho); while (!viewer.wasStopped ()) { //you can also do cool processing here //FIXME: Note that this is running in a separate thread from viewerPsycho //and you should guard against race conditions yourself... user_data++; } std::cout << "Quit" << std::endl; viewer.~CloudViewer(); }
-
-
@surajj4837 As I thought: viewer is allocated on the STACK not heap. So, no need to delete it!
Remove viewer.~CloudViewer(); -
@jsulm That was the original problem I started with. The following statement was not there earlier
viewer.~CloudViewer();
But when I clicked on close button of viewer the cloudviewer window still existed on screen, so I tried closing through code. But that raised the error.
-
This viewer declaration is in line #55:
pcl::visualization::CloudViewer viewer("Cloud Viewer");
When destructor is called the execution jumps to that line.
-
@surajj4837 said in Mainwindow closes when I close PCL window.:
But when I clicked on close button of viewer the cloudviewer window still existed on screen
Then debug your code instead of doing strange things like deleting stack allocated objecs. Probably you're hanging in while (!viewer.wasStopped ()) loop.
-
@surajj4837 Also, does pcl::visualization::CloudViewer allocate the actual dialog on the heap?
-
@surajj4837
For one thing, because of yourpcl::visualization::CloudViewer viewer("Cloud Viewer");
local variable this will be automatically destructed on reaching the end of function's
}
scope. You shouldn't call the destructor explicitly, even if that was OK I imagine it would cause double-destruction on exiting the method.... -
@jsulm The CloudViewer constructor definition says it creates the object on heap.
-
-
Christian Ehrlicher Lifetime Qt Championreplied to surajj4837 on 3 May 2021, 08:28 last edited by Christian Ehrlicher 5 Mar 2021, 08:29
@surajj4837 You must not call a dtor for an object when you created it on the stack as you did - no matter if you call it in an unusual way like you did or with the correct c++ way by calling delete. C++ basics.
-
@JonB https://www.geeksforgeeks.org/possible-call-constructor-destructor-explicitly/
Explicit call to destructor is only necessary when object is placed at particular location in memory by using placement
new
.Do you have any evidence this is the case for you?
3/29