我定义了这个结构:

struct s_molecule
{
  std::string res_name;
  std::vector<t_particle> my_particles;
  std::vector<t_bond> my_bonds;
  std::vector<t_angle> my_angles;
  std::vector<t_dihedral> my_dihedrals;

  s_molecule& operator=(const s_molecule &to_assign)
  {
    res_name = to_assign.res_name;
    my_particles = to_assign.my_particles;
    my_bonds = to_assign.my_bonds;
    my_angles = to_assign.my_angles;
    my_dihedrals = to_assign.my_dihedrals;
    return *this;
  }
};

这些结构:

typedef struct s_particle
{
  t_coordinates position;
  double charge;
  double mass;
  std::string name;
  std::vector<t_lj_param>::iterator my_particle_kind_iter;

  s_particle& operator=(const s_particle &to_assign)
  {
    position = to_assign.position;
    charge = to_assign.charge;
    mass = to_assign.mass;
    name = to_assign.name;
    my_particle_kind_iter = to_assign.my_particle_kind_iter;
    return *this;
  }
} t_particle;

struct s_bond
{
  t_particle * particle_1;
  t_particle * particle_2;
  std::vector<t_bond_param>::iterator my_bond_kind_iter;

  s_bond& operator=(const s_bond &to_assign)
  {
    particle_1 = to_assign.particle_1;
    particle_2 = to_assign.particle_2;
    my_bond_kind_iter = to_assign.my_bond_kind_iter;
    return *this;
  }
};

然后,在我的代码中,我将指针返回到S_Molecule(Typedef'd to t_molecule,但仍然)。

使用此指针,我可以使此代码工作:

for  (unsigned int i = 0;
      i < current_molecule->my_particles.size();
      i++)
    {
      std::cout << "Particle " 
        << current_molecule->my_particles[i].name << std::endl
            << "Charge: " 
        << current_molecule->my_particles[i].charge << std::endl
        << "Mass: " 
        << current_molecule->my_particles[i].mass << std::endl
        << "Particle Kind Name: " 
        << (*current_molecule->my_particles[i].my_particle_kind_iter).atom_kind_name 
        << std::endl
        << "x: " << current_molecule->my_particles[i].position.x 
        << " y: " << current_molecule->my_particles[i].position.y
    #ifdef USE_3D_GEOM
        << "z: " << current_molecule->my_particles[i].position.z
    #endif
        << std::endl;
    }

如果我替换为:

for  (std::vector<t_particle>::iterator it = current_molecule->my_particles.begin();
      it !=current_molecule->my_particles.end();
      it++)
    {
      std::cout << "Particle " 
        << (*it).name << std::endl
            << "Charge: " 
        << (*it).charge << std::endl
        << "Mass: " 
        << (*it).mass << std::endl
        << "Particle Kind Name: " 
        << (*(*it).my_particle_kind_iter).atom_kind_name 
        << std::endl
        << "x: " << (*it).position.x 
        << " y: " << (*it).position.y
    #ifdef USE_3D_GEOM
        << "z: " << (*it).position.z
    #endif
        << std::endl;
    }

我现在得到了讨厌的segfaults ...

不要在这里放太多,但是当我尝试这样做时,我也会得到segfaults:

std::cout << "Bond ATOMS : " 
          << (*current_molecule).my_bonds[0].particle_1->name
          << std::endl

同样,Current_molecule是一个指向S_MOLECULE结构的指针,其中包含结构数组,而结构阵列又直接具有VAR或指示。我无法获得这些间接多个层的工作。关于修复这些segfaults的建议。

仅供参考,我正在用G ++编译Linux CentOS 5.4,并使用自定义makefile系统。

有帮助吗?

解决方案 4

同样,此问题在这里得到了回答:C ++中的怪异指针问题由Deadmg。重复发帖,抱歉。

其他提示

@SBI感谢您的好建议!我相信您是对的 - 任务负载运算符是不必要的,应该被报废。

我遵循评论内容的方法,非常困惑。基本上,在将指针传递给我的特定分子到要打印的主要函数的函数中,我可以完美地看到该分子中的所有数据(键,粒子,名称等),并用COUT打印。

一旦我将其作为PTR传递到MAIN,如果我将PTR与迭代器一起使用,我会得到segfault。换句话说。同样出于某种原因,债券数据(我可以在返回指针的功能中自由打印)也会在我尝试打印它的情况下进行segfault,即使我使用[]来索引债券的向量(适用于粒子的键向量)。

这是我现在可以提供的最好的信息。

疯狂的猜测:您是否正在使用共享库。我记得很难在共享的图书馆边界中来回传递STL-Containers。

戴维·罗德里格斯(DavidRodríguez)在评论中询问了杰森(OP):

您是否正在将指针返回到本地变量?

杰森回答:

NO它是类变量的PTR。该类非常存在(其中包含返回分子的函数)。

除非您说一个真实的类变量(合格为 static),事实 班级 存在与之无关。 实例 一个班级的存在,即使您只是在它们上调用了功能,它们也可能已经不再存在。

因此,问题是:

  • 实例 返回指针的班级 current_molecule 仍然存在吗?
  • 或是 current_molecule 资格为 static, ,即成为真正的类变量?

如果两个问题的答案是“否”,那么您在不确定的县。

在这一点上,非常重要的是,您可以在这里发布我们可以使用我们来重现问题的源代码。它很可能位于您没有向我们展示的来源中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top