доступ к boost: shared_ptr за пределами основной области действия сбой с ошибкой утверждения: px! = 0. Как правильно использовать указатель? - PullRequest
0 голосов
/ 11 сентября 2018

Доступ к облаку, который имеет тип boost: shared_ptr падает с ошибкой утверждения: px! = 0 ошибка вне основного, но внутри основного все нормально.

Я собираюсь использовать PCL в программе Qt, где мне нужен доступ к указателю на облако вне области, где этот указатель объявлен как f.ex в MainWindow :: classxyz (), поэтому я написал этот тестпрограмма для иллюстрации моей проблемы (см. ниже)

Как правильно использовать указатель, чтобы иметь возможность доступа к указателю облака также вне области действия main?(и Qt вне области MainWindow: MainWindow (), поскольку я инициализирую указатель в конструкторе)

pcd_read.h:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
void outside();

pcd_read.cpp:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

#include "pcd_read.h"

int
main (int argc, char** argv)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

  if (pcl::io::loadPCDFile<pcl::PointXYZ> ("C:/Users/user2/Documents/qt_test_kode_div/pcd_file_scope_test/build/Debug/test_pcd.pcd", *cloud) == -1) //* load the file
  {
    PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
    return (-1);
  }
  std::cout << "Loaded "
            << cloud->width * cloud->height
            << " data points from test_pcd.pcd with the following fields: "
            << std::endl;

            std::cout << cloud->size();     //This works

  outside();                                //When I call outside() the code crashes inside outside()

  for (size_t i = 0; i < cloud->points.size (); ++i)
    std::cout << "    " << cloud->points[i].x
              << " "    << cloud->points[i].y
              << " "    << cloud->points[i].z << std::endl;


  return (0);
}

void outside()
{
    std::cout << cloud->size();         // This crashes. Why does accessing cloud cause a crash related to Boost? Assertion failed: px != 0
                                        // The pointer seems to not be initialized. 
                                        // I want the pointer to be accessible also in outside without passing as a parameter. How can I achieve that?
}

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Как уже упоминалось @chrisD, изменение инициализации указателя на обычный указатель решило эту проблему.

.h:

//pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;    // original -- CRASHES OUTSIDE SCOPE - smartpointer ... 
pcl::PointCloud<pcl::PointXYZ> *cloud;          // changed to normal pointer -- now no crash ... since it is inside scope
void outside();

.cpp

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

#include "pcd_read.h"

int
main (int argc, char** argv)
{
    //pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);        // Causes a crash when cloud is outside of scope
    cloud = new pcl::PointCloud<pcl::PointXYZ>();    //Initializes pointer the std. way instead

  if (pcl::io::loadPCDFile<pcl::PointXYZ> ("C:/Users/user2/Documents/qt_test_kode_div/pcd_file_scope_test/build/Debug/test_pcd.pcd", *cloud) == -1) //* load the file
  {
    PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
    return (-1);
  }
  std::cout << "Loaded "
            << cloud->width * cloud->height
            << " data points from test_pcd.pcd with the following fields: "
            << std::endl;

            std::cout << cloud->size();     //This works

  outside();

  for (size_t i = 0; i < cloud->points.size (); ++i)
    std::cout << "    " << cloud->points[i].x
              << " "    << cloud->points[i].y
              << " "    << cloud->points[i].z << std::endl;


  return (0);
}

void outside()
{
    std::cout << cloud->size();         // Now OK
0 голосов
/ 11 сентября 2018

Вы объявили другую переменную с тем же именем cloud внутри main.

Следовательно, глобальная переменная не видна внутри main и оставлена ​​неиспользованной, пока вы не позвоните outside,который тогда все еще относится к неиспользованному глобальному.

...