删除[]时的SegFault

时间:2012-03-26 22:27:51

标签: c++ class memory-management segmentation-fault

我正在为一个现有的主程序开发一个类,它在delete []行上抛出一个段错误。我不太确定为什么这样做。我问教授,我被告知重读有关指针如何被破坏的部分。任何帮助,将不胜感激!相关代码如下。

来自主要:

Point* v = new Point[nVertices];
for (int i = 0; i < nVertices; ++i)
  in >> v[i].x >> v[i].y;
Asteroid aster1 (nVertices, v);
delete [] v;

小行星构造函数的类部分:

Asteroid::Asteroid(int nVertices, Point vertexPoints[]){
    numVertices = nVertices;
    for (int i = 0; i < numVertices; i++){
        vertices[i] = vertexPoints[i];
    }
}

.h部分如果有意义:

class Asteroid{
    int numVertices;
    Point vertices[];
public:
    //Attributes
    Asteroid (int,Point*);

3 个答案:

答案 0 :(得分:2)

段错误看起来不太可能在delete[]行。它更有可能发生在Asteroid构造函数中,因为在创建应该包含它们的数组之前,您已经尝试访问顶点。

答案 1 :(得分:1)

我原来的回答是错的,但这就是我认为user268396的意思。

class Asteroid{  
    int numVertices;  
    Point* vertices;  // change vertices to be a pointer.
public:  
    //Attributes  
    Asteroid (int,Point*);  

并且您的构造函数应该具有以下内容:

Asteroid::Asteroid(int nVertices, Point vertexPoints[]){ 
    numVertices = nVertices; 
    // Allocate array here. You should also you should add a delete[] in the destructor.
    vertices = new Point[numVertices];

    for (int i = 0; i < numVertices; i++){ 
        vertices[i] = vertexPoints[i]; 
    } 
} 

答案 2 :(得分:0)

delete []的调用不是你的程序变坏的地方。

您在vertices课程中初始化Asteroid的位置是什么?我所看到的只是一个零大小数组的声明(根据你的编译器,它可能会发出警告)。

如何完全忘记数组并使用vector<T>?那,或者将vertices声明为指针并正确初始化它。