【问题标题】:SegFault when delete []删除时的 SegFault []
【发布时间】:2012-03-26 22:27:51
【问题描述】:

我正在为现有的主程序编写一个类,它在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*);

【问题讨论】:

  • 没有为Asteroid::vertices 分配内存。另外,请使用std::vector
  • 除了出于病态的好奇心之外,您根本不应该使用指针,newdelete
  • in 是什么?你的意思是std::cin
  • @ShiggityShiggityShwa:取决于他们所处的级别。如果这是一个面向初学者的 C++ 课程,他们甚至不应该谈论指针或newdelete
  • 当你说“我们不教他们语言的核心元素”,然后接着说“你表现得好像他们不会学习语言”时,好像我没有甚至不必回应就可以表达我的观点。如果您想教授没有内存管理的 C++,请教 Java。工业中没有“现代 C++”之类的东西。只有在您需要这些功能时才使用 C++。

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


【解决方案1】:

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

【讨论】:

  • 那么我该去哪里初始化数组呢?我认为它是在我使用指针 v 指向的数据传递给构造函数时创建的。
  • 您应该在 为其内容赋值之前这样做。所以vertices = new Point[nVertices];for 循环之前的构造函数中。
【解决方案2】:

我原来的答案是错误的,但这就是我认为 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]; 
    } 
} 

【讨论】:

  • 我认为指针 (v) 只是指向动态数组的指针。当我调用构造函数时,我认为我正在将它指向的所有数据复制到一个新数组中(不被指针引用)......对不起,如果这听起来令人困惑,那是因为我很困惑! :)
  • 我可以理解,因为我自己搞混了。 user268396 是正确的,您需要在分配给顶点之前初始化顶点。
【解决方案3】:

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

您在Asteroid 类中的哪里初始化vertices?我所看到的只是一个零大小数组的声明(这可能会根据您的编译器发出警告)。

完全忘记数组并使用vector&lt;T&gt; 怎么样?或者将vertices声明为指针并正确初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多