指针值未正确传递给重载的equals运算符(C ++)

时间:2013-08-02 00:05:24

标签: c++ pointers pass-by-reference pass-by-value

我有一个重载的=运算符,它正确传递了particle类中的一些值,但没有传递其他值。我在线排除故障,找不到任何与此问题直接相关的内容。我在C ++中相当称职的同行无法提供帮助,建议我在这里发帖。非常感谢任何帮助。

widthheightwrapparticlenarray的所有值都完美无缺。但是,xposyposxvelyvel的值传递的值不正确。对于xposypos,每个第11个元素都正确传递,但所有其他元素都等于零;我希望这些值都不为零。在main中,在立即进行gen1 = gen0;的操作中,gen0的所有解除引用的值都是正确的。我估计他们不知道怎么没有正确通过?如果需要,我会很乐意发布更多代码/信息。再次,任何见解都将深受赞赏。谢谢。

相关代码:

class particle{             
private:
    int* xpos;  
    int* ypos; 
    int* xvel;
    int* yvel;
    int* array;             
    int width;
    int height; 
    int wrap;
    int particlen;
public:
    void operator=(const particle&);
}

overloaded = operator的相关部分:

void particle::operator=(const particle &current){
    int a,b,i,j;
    width = current.width;
    height = current.height;
    wrap = current.wrap;
    particlen = current.particlen;
    array = new int[width*height];
    xpos = new int[particlen];
    ypos = new int[particlen];
    xvel = new int[particlen];
    yvel = new int[particlen];

    for(a=0; a<height; a++){
        for(b=0; b< width; b++){
        this->array[a*width + b] = current.array[a*width + b];
        }
    } 

for(i = 0; i < particlen; i++){
    this->xpos[i] = current.xpos[i];
    this->ypos[i] = current.ypos[i];
    this->xvel[i] = current.xvel[i];
    this->yvel[i] = current.yvel[i];
}

主要相关部分:

int main(){
    particle gen0,gen1;
    gen1 = gen0;
}

根据Sehe的建议,我编辑了我的代码。但是,我现在使用最简单的命令获得内存分配问题。 &lt;&lt;&lt;运算符,在我的main中调用的第一个操作不允许将我的数组变量设置为等于读入文件中的整数。我绝对知道该文件是可读的,因为第一个输出行打印。但是,我在array[i*width + j] = k;处得到了分段错误11。 GDB打印输出:程序接收信号EXC_BAD_ACCESS,无法访问内存。 原因:KERN_INVALID_ADDRESS位于地址:0x0000000000000000 particle :: operator&lt;&lt;中的0x000000010001c4f4 (这= 0x7fff5fbfcb08,file = 0x7fff5fbffa90“100100”)at before typedef 1 vector.cpp:686 686 array [i * width + j] = k;

我已经在线查找了矢量库的正确术语,并认为我的语法是正确的。有什么想法吗?

更新(8月2日东部时间9点)

我仍然遇到NULL指针问题。使用gdb进行调试时,收到消息:

KERN_INVALID_ADDRESS at address:0x0000000000000000 0x000000010001d807 in particle :: operator&lt;&lt; (这= 0x7fff5fbfcb08,file = 0x7fff5fbffa90“5040”)at before typedef 1 vector.cpp:688 688 array [(i * width + j)] = k;

我对NULL指针没什么经验;有关为什么会发生这种情况的任何建议,以及如何解决这个问题?这是相关代码(总代码约为900行)

class particle{             
private:
    std::vector<int> xpos;  
    std::vector<int> ypos; 
    std::vector<int> xvel; 
    std::vector<int> yvel; 
    std::vector<int> array; 
    int width;      
    int height;     
    int wrap;       
    int particlen; // number of particles read in
public:
    void operator<<(particle);
    void Collision(int, int, particle); 
    void operator>>(char*);
    void operator<<(char*);
};

void particle::operator<<(char* file) // Reads initial input file
{
ifstream in_file;
in_file.open( file);    // open the file
int i,j,k;
}
in_file >> width >> height >> wrap >> particlen;
    for(i=0; i<height; i++){
        for(j=0; j< width; j++){
            in_file >> k;
            array[i*width + j] = k; // This is line 688 which GDB references
        }
    }
}

void particle::operator<<(particle current){
int i,k,j,l;

for(k = 0; k < height*width; k++)
{
    array[k] = 0;
}

k = 0;

for(i=0; i < particlen; i++)
{
    cout << "Current x pos is" << current.xpos[i] << endl;
}

for(i=0; i < particlen; i++)
{

    if(array[ (current.ypos[i]-1)*width + (current.xpos[i] - 1) ] == 0 )
    {
    //cout << "Current X position[" << i << "] is" << current.xpos[i] << endl;
        xpos[i] = current.xpos[i] + (current.xvel[i])*timeinc;
        if(xpos[i] > width) xpos[i] = xpos[i] - width; 
        ypos[i] = current.ypos[i] + (current.yvel[i])*timeinc;
        if(ypos[i] > width) ypos[i] = ypos[i] - height;

    //cout << "Next X position[" << i << "] is" << xpos[i] << endl;
    }

    if(array[ (current.ypos[i]-1)*width + (current.xpos[i] - 1) ] > 1 && current.JC[i] != 1)
    {
        for(l=i+1; l < particlen; l++)
        {
            if(current.xpos[l] == current.xpos[i] && current.ypos[l] == current.ypos[i] && current.JC[l] != 1)
            {
            Collision(i,l,current);
            }
        }
    }
}

for(i=0; i < particlen; i++)
{
    array[ (xpos[i]-1)*width + (ypos[i]-1) ] = 1;
}
Display();}

int main()
{
    char filename[256];
    particle gen0, gen1;
    gen0 << filename;
    gen1 = gen0;
    gen0 << gen1; // Calculates the next state of gen0, based on the values in gen1.
}

我知道这很长,但我认为这是我能提供的最少信息。我想也许问题出在gen0 << gen1运算符上,所以我把方法包括在内。

1 个答案:

答案 0 :(得分:2)

就像我在评论中暗示的那样,99%的人说你违反了三级规则

值得注意的是,你有赋值运算符,但看不到复制构造函数。这可能意味着如果复制,数组指针最终将“非法”共享。我也假设你有一个析构函数删除那些数组(在一个实例中),从而使复制的数组无效到另一个实例。

首先避免手动内存管理来解决此问题:

#include <vector>

class particle{             
    std::vector<int> xpos;  
    std::vector<int> ypos; 
    std::vector<int> xvel;
    std::vector<int> yvel;
    std::vector<int> array;             
    int width;
    int height; 
    int wrap;
    int particlen; // or use `xpos.size()` e.g.
};

int main()
{
    particle gen0,gen1;
    gen1 = gen0;
}

PS。您可能希望在需要边界检查时考虑使用v.at(i)而不是v[i]。这对调试问题有很大帮助。