C++ 删除时出现SEGFULT[]

C++ 删除时出现SEGFULT[],c++,class,memory-management,segmentation-fault,C++,Class,Memory Management,Segmentation Fault,我正在为现有主程序编写一个类,它在delete[]行上抛出一个segfault。我不太清楚它为什么这样做。我问过教授,他们让我重读关于指针如何损坏的部分。任何帮助都将不胜感激!相关代码如下 从主要方面: Point* v = new Point[nVertices]; for (int i = 0; i < nVertices; ++i) in >> v[i].x >> v[i].y; Asteroid aster1 (nVertices, v); delete

我正在为现有主程序编写一个类,它在
delete[]
行上抛出一个segfault。我不太清楚它为什么这样做。我问过教授,他们让我重读关于指针如何损坏的部分。任何帮助都将不胜感激!相关代码如下

从主要方面:

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;

调用
delete[]
并不是程序出错的地方

小行星
类中,您在哪里初始化
顶点
?我看到的只是一个零大小数组的声明(根据编译器的不同,可能会发出警告)


完全忘记数组并使用
vector
如何?或者将
顶点声明为指针并正确初始化。

调用
delete[]
并不是程序出错的地方

小行星
类中,您在哪里初始化
顶点
?我看到的只是一个零大小数组的声明(根据编译器的不同,可能会发出警告)


完全忘记数组并使用
vector
如何?或者将
顶点声明为指针并正确初始化。

segfault似乎不太可能位于
删除[]
行。它更可能发生在小行星构造函数中,因为在创建包含顶点的数组之前,您已经尝试访问顶点了。

segfault似乎不太可能位于
删除[]
行。这很可能发生在小行星构造函数中,因为在创建包含顶点的数组之前,您已经尝试访问顶点了。

我最初的答案是错误的,但我认为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]; 
    } 
} 
Asteroid::Asteroid(int-nVertices,Point-vertexPoints[]){
numVertices=n证书;
//在这里分配数组。您还应该在析构函数中添加delete[]。
顶点=新点[numVertices];
对于(int i=0;i
我最初的答案是错误的,但这就是我认为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]; 
    } 
} 
Asteroid::Asteroid(int-nVertices,Point-vertexPoints[]){
numVertices=n证书;
//在这里分配数组。您还应该在析构函数中添加delete[]。
顶点=新点[numVertices];
对于(int i=0;i
没有为小行星::顶点分配内存。另外,使用
std::vector
。除了出于病态的好奇心,你根本不应该使用指针、
new
delete
。在
是什么?你的意思是
std::cin
?@ShiggityShiggityShwa:取决于他们的级别。如果这是一个C++初学者的类,他们甚至不应该谈论指针或<代码>新< /代码>或<代码>删除>代码>当你说“我们不教他们语言的核心元素”,然后跟着“你的行为就像他们不能学习语言”一样,看起来我甚至不必做出回应来表明我的观点。如果你想教C++,没有内存管理,教java。工业上没有“现代C++”这样的东西。只有当你想要这些特性时才使用C++。没有分配内存给<代码>小行星::顶点< /代码>。另外,使用
std::vector
。除了出于病态的好奇心,你根本不应该使用指针、
new
delete
。在
是什么?你的意思是
std::cin
?@ShiggityShiggityShwa:取决于他们的级别。如果这是一个C++初学者的类,他们甚至不应该谈论指针或<代码>新< /代码>或<代码>删除>代码>当你说“我们不教他们语言的核心元素”,然后跟着“你的行为就像他们不能学习语言”一样,看起来我甚至不必做出回应来表明我的观点。如果你想教C++,没有内存管理,教java。工业上没有“现代C++”这样的东西。只有当你想要这些特性时才使用C++。我认为指针(V)只是指向动态数组的指针。当我调用构造函数时,我认为我正在将它指向的所有数据复制到一个新数组中(没有被指针引用)。。。抱歉,如果这听起来让人困惑,那是因为我感到困惑!:)我能理解,因为我把自己搞糊涂了。user268396是正确的,您需要在分配给顶点之前初始化顶点。我认为指针(v)只是指向动态数组的指针。当我调用构造函数时,我认为我正在将它指向的所有数据复制到一个新数组中(没有被指针引用)。。。抱歉,如果这听起来让人困惑,那是因为我感到困惑!:)我能理解,因为我把自己搞糊涂了。user268396是正确的。在分配给顶点之前,您需要初始化顶点。那么,我应该在哪里初始化数组?我认为它是在我使用指针v指向的数据传递给构造函数时创建的。在为其内容赋值之前,您应该这样做。比如
vertices=新点[nVertices]for
循环的
之前的构造函数中的code>。那么我应该在哪里初始化数组呢?我认为它是在我使用指针v指向的数据传递给构造函数时创建的。在为其内容赋值之前,您应该这样做。比如
vertices=新点[nVertices]for
循环之前的构造函数中的code>。