Вопрос

Я определяю эту структуру:

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

Опять же, Curect_MOLecule является указателем на структуру S_MOLCULE, которая содержит массивы конструкций, которые, в свою очередь, либо непосредственно имеют VARS, либо являются указателями. Я не могу получить эти несколько слоев косвенности на работу. Предложения по исправлению этих SegFaults.

FYI Я составляю в Linux Centos 5.4 с G ++ и используя пользовательскую систему Makefile.

Это было полезно?

Решение 4

Опять же, эта проблема ответила здесь:Странная проблема указателя в C ++Deadmg. Извините за двойной пост.

Другие советы

@sbi Спасибо за хороший совет! Я верю, что вы правы - перегруженный оператор назначения не нужен и должен быть сболен.

Я следовал на подходе комментирования материалов и очень запутался. В основном в функции, которая проходит указатель на мою конкретную молекулу к основной функции для печати, я могу видеть все данные в этой молекуле (облигации, частицы, имя, и т. Д.). Прекрасно, печать с Cout.

Как только я передаю его на главную как PTR, если я буду использовать этот PTR с итератором, я получаю SegFault. Другими словами. Также по какой-то причине данные облигаций (которые я могу свободно печатать в моем функционале, который возвращается к указателю), также SegFaults, если я стараюсь распечатать его, даже если я использую [], чтобы индексировать вектор облигаций (который работает для частицы вектор).

Это лучшая информация, которую я могу дать сейчас.

Дикое предположение: вы используете общие библиотеки. Я помню, как трудности, проходящие STL-контейнеры взад и вперед по общим границам библиотеки.

Джейсон (ОП) был задан в комментарии Давида Родригеза:

Вы возвращаете указатель на локальную переменную?

Джейсон ответил:

Нет его ptr к переменной класса. Класс очень много существует (он содержит функцию, которая возвращает молекулу).

Если вы не говорите об истинной переменной классов (квалифицирован как static), тот факт, что класс существует, не имеет много общего с этим. Экземпляры существуют в классе, и они могли бы перестать существовать, даже если вы только что назвали функцией на них.

Как таковой, вопрос:

  • Делает экземпляр класса, который вернул указатель current_molecule все-еще существует?
  • Или есть current_molecule Квалифицировано как static, т.е. быть настоящей классовой переменной?

Если ответ на обоих вопросах «нет», вы находитесь в неопределенном округе.

На данный момент становится очень важно, чтобы вы публикуете исходный код, который можно использовать нами здесь, чтобы фактически воспроизвести проблему; Это вполне может быть расположено в источнике, вы не показываете нас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top