1

我定义了这个结构:

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 的指针(类型定义为 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;
    }

我现在遇到讨厌的段错误...

不要在这里放太多,但是当我尝试这样做时,我也会遇到段错误:

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

同样, current_molecule 是指向 s_molecule 结构的指针,该结构包含结构数组,而这些结构又或者直接具有变量或者是指针。我无法让这些多层间接工作。有关修复这些段错误的建议。

仅供参考,我正在使用 g++ 并使用自定义 makefile 系统在 Linux Centos 5.4 上进行编译。

4

4 回答 4

0

杰森(OP)在大卫罗德里格斯的评论中被问到:

您是否返回指向局部变量的指针?

杰森回答:

不,它是类变量的指针。该类非常存在(它包含返回分子的函数)。

除非您谈论的是真正的类变量(限定为),否则该类static存在的事实与它没有太大关系。一个类的实例是存在的,即使你只是在它们上面调用了一个函数,它们也可能已经不复存在了。

因此,问题是:

  • 返回指针的类的实例是否current_molecule仍然存在?
  • 或者被current_molecule限定为static,即是一个真正的类变量?

如果这两个问题的答案都是“否”,那么您就在未定义县。

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

于 2010-06-25T13:26:37.997 回答
0

@sbi 感谢您的好建议!我相信你是对的——赋值重载运算符是不必要的,应该被废弃。

我遵循了注释掉东西的方法,我很困惑。基本上在将指向我的特定分子的指针传递给要打印的主函数的函数中,我可以完美地看到该分子中的所有数据(键、粒子、名称等),并使用 cout 进行打印。

一旦我将它作为 ptr 传递给 main,如果我将该 ptr 与迭代器一起使用,我会得到一个段错误。换句话说。同样由于某种原因,如果我尝试打印键数据(我可以在返回指针的函数中自由打印)也会出现段错误,即使我使用 [] 来索引键向量(适用于粒子向量)。

这是我目前能提供的最好信息。

于 2010-06-25T06:41:08.787 回答
0

同样,这个问题在这里得到了回答: DeadMG的 Weird Pointer issue in C++ 。重复发帖,抱歉。

于 2010-08-27T16:37:34.743 回答
0

一个疯狂的猜测:您是否使用共享库。我记得在跨共享库边界来回传递 STL 容器时遇到了困难。

于 2010-06-25T12:15:12.673 回答