SegFault при удалении [] - PullRequest
       16

SegFault при удалении []

0 голосов
/ 27 марта 2012

Я работаю над классом для существующей основной программы, и он создает ошибку segfault в строке 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 ]

2 голосов
/ 27 марта 2012

Очень маловероятно, что сегфо находится на линии delete[]. Гораздо более вероятно, что это происходит в конструкторе Asteroid, поскольку вы уже пытаетесь получить доступ к вершинам до того, как создали массив, который должен содержать их.

1 голос
/ 27 марта 2012

Мой первоначальный ответ был неверным, но это то, что, по-моему, означает 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]; 
    } 
} 
0 голосов
/ 27 марта 2012

Звонок на delete [] не там, где ваша программа работает плохо.

Где вы инициализируете vertices в вашем Asteroid классе? Все, что я вижу, это объявление массива нулевого размера (который, вероятно, должен выдавать предупреждение в зависимости от вашего компилятора).

Как насчет того, чтобы полностью забыть о массивах и использовать vector<T>? Или объявите vertices как указатель и правильно его инициализируйте.

...