艰难:处理 C++ 中的深度嵌套指针

发布于 2024-09-07 03:32:36 字数 3603 浏览 2 评论 0原文

我定义了这个结构:

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 结构的指针,该结构包含结构数组,这些结构数组要么直接具有变量,要么是指针。我无法让这些多层间接工作。关于修复这些段错误的建议。

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

I define this structure:

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;
  }
};

and these structures:

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;
  }
};

and then in my code I return a pointer to an s_molecule (typedef'd to t_molecule, but still).

Using this pointer I can get this code to work:

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;
    }

If I replace it with:

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;
    }

I now get nasty segfaults...

Not to put too much here, but I'm also getting segfaults when I tried to do this:

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

Again, current_molecule is a pointer to a s_molecule structure, which contains arrays of structures, which in turn either directly have vars or are pointers. I can't get these multiple layers of indirection to work. Suggestions on fixing these segfaults.

FYI I'm compiling on Linux Centos 5.4 with g++ and using a custom makefile system.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不奢求什么 2024-09-14 03:32:37

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

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

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

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

@sbi Thanks for the good advice! I believe you are right -- the assignment overloaded operator is unnecessary and should be scrapped.

I've followed the approach of commenting out stuff and am very confused. Basically in the function that passes the pointer to my particular molecule to the main function to print, I can see all the data in that molecule (bonds, particles, name, etc) perfectly, printing with cout's.

Once I pass it to the main as a ptr, if I use that ptr with an iterator I get a segfault. In other words. Also for some reason the bond data (which I can freely print in my funct that returns to the pointer) also segfaults if I try to print it, even if I use the [] to index the vector of bonds (which works for the particle vector).

That's the best info I can give for now.

长不大的小祸害 2024-09-14 03:32:37

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

A wild guess: Are you using shared libraries. I remember having difficulties passing STL-containers back and forth across shared library boundaries.

樱娆 2024-09-14 03:32:37

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

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

杰森回答:

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

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

因此,问题是:

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

如果两个问题的答案都是“否”,则您位于未定义县。

此时,发布我们可以在此处实际重现问题的源代码就变得非常重要;它很可能位于您未向我们展示的源中。

Jason (OP) was asked in a comment by David Rodríguez:

Are you returning a pointer to a local variable?

Jason answered:

No its a ptr to a class variable. The class is very much in existence (it contains the function that returns the molecule).

Unless you're talking of a true class variable (qualified as static), the fact that the class exists doesn't have much to do with it. Instances of a class exist, and they might have ceased to exist even if you just called a function on them.

As such, the question is:

  • Does the instance of the class that returned the pointer current_molecule still exist?
  • Or is current_molecule qualified as static, i.e. being a true class variable?

If the answer to both questions is "no", you're in Undefined County.

At this point, it becomes very important that you post source code that can be used by us here to actually reproduce the problem; it might well be located in source you aren't showing us.

恍梦境° 2024-09-14 03:32:37

同样,这个问题在这里得到了回答:
C++ 中奇怪的指针问题
由 DeadMG 制作。抱歉双重帖子。

Again, this issue was answered here:
Weird Pointer issue in C++
by DeadMG. Sorry for the double post.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文