【问题标题】:c++ reading an array of objects causes SIGSEGVc ++读取对象数组导致SIGSEGV
【发布时间】:2014-04-25 20:38:20
【问题描述】:

我有两个类:Vector 和 Particle...

class Vector {
public:
    float x,y;
};

class Particle {
public:
    Vector* coord;
    Particle(Vector* coord)
    {
        this->coord = coord;
    };
};

...和这样声明的数组:

Particle* particles [PARTICLES];

这是我的主要内容:

int main(int argc, char** argv)
{
    //Write
    int i = 0;
    do{
        particles[i] = new Particle(new Vector());
    }while(
           ++i<PARTICLES
           );
    i = 0;

    //Read
    int j = 0;
    float s = .0f,
    a = .0f;
    Vector vi = *(particles[0]->coord),
    vj = *(particles[0]->coord);
    do{
        do{
            if(i!=j){
                vi = *(particles[i]->coord);
                vj = *(particles[j]->coord); //FIXME
            }
        }while(
               ++j<PARTICLES //For values >1 throws SIGSEGV
               );
    }while(
           ++i<PARTICLES
           );

    return 0;
}

只要 PARTICLES >1,就会抛出一个 SIGSEGV。注释掉 FIXME 行使其正常工作。

完整代码在这里:http://codepad.org/dI2ve5Pc

为什么会失败,有没有办法修复它?

谢谢你:)

【问题讨论】:

  • 我正在使用 gpp 编译使用这个命令:g++ teh_problem.cpp -o out
  • 解决问题的方法是使用手动内存管理退出并开始使用std::vector
  • 为什么第一个 do-while 循环的编码方式让我头晕目眩?为什么不在循环中简单地增加i?为什么让它成为while 条件的一部分?
  • 您使用 c-with 类而不是 c++ 是否有特殊原因?
  • 你当然不应该将你的类命名为点坐标Vector。有一个名为vector 的标准库类,您应该将其用于您的粒子数组。而且您不应该为coord 成员变量使用动态内存。这只会给你带来不可读性和内存管理的噩梦。

标签: c++ arrays object segmentation-fault


【解决方案1】:

循环写错了。 j 在内循环的第二次迭代之前不会被重置。为什么不像大多数人通常那样编写循环代码:

for (i = 0; i < PARTICLES; i++) {
    for (j = 0; j < PARTICLES; j++) {
        // ...
    }
}

【讨论】:

    【解决方案2】:

    记得在j的循环每次迭代后将j重置为0

     do{
      do{
       if(i!=j){
        vi = *(particles[i]->coord);
        vj = *(particles[j]->coord); //FIXME
       }
      }while(
       ++j<PARTICLES //For values >1 throws SIGSEGV
      );
    
      // Reset j here
      j = 0;
      ///////////////
    
     }while(
      ++i<PARTICLES
     );
    

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 2019-06-18
      • 2010-12-06
      • 1970-01-01
      相关资源
      最近更新 更多