c++ - 我的动态数组出现问题-线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x0)

标签 c++ class constructor dynamic-arrays

我在进行调试时遇到问题:Xcode提供:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)



我认为我的动态数组有问题...

我的任务是计算具有点的多边形的周长。

因此,我的程序接收到点(x和y)来填充Point s数组,然后创建另一个数组distance,我用所有距离填充了该数组,然后可以计算周长。

我不知道是否很清楚,但是我是C++的初学者。

#include <iostream>
#include "Point.h"
#include "Polygone.h"
using namespace std;
int main() {
    int numberSide;
    int x,y;
    Point* array = nullptr;
    Polygone myPolygone;
    cout<<"enter number of sides:"<<endl;
    cin>>numberSide;
    float* distance=new float[numberSide];
    cout<<"enter points:"<<endl;
    for (int i=0; i<numberSide; i++) {
        cin>>x>>y;
        Point p(x,y);
        array[i]=p;
    }
    for (int i=0; i<numberSide-1; i++) {
        distance[i]=array[i].distance(array[i+1]);
    }
    distance[numberSide]=array[0].distance(array[numberSide]);
    myPolygone.perimeter(distance);
    delete [] distance;

    return 0;
}

最佳答案

您实际上并没有为array变量分配任何空间-您只是在声明它并为其分配一个nullptr值。因此,当您稍后尝试执行array[i]=p;时,尝试取消引用空指针,这会导致EXC_BAD_ACCESS错误。

要解决此问题,一旦知道数组的大小(即多边形有多少边),就需要分配数组。您应该按照分配distance数组的相同方式执行此操作:

    cin>>numberSide;
    float* distance=new float[numberSide];
    Point* array = new Point[numberSide]; // And you should delete the earlier "Point* array = nullptr;` line

当然,完成后还需要释放内存:

    delete [] distance;
    delete [] array;
    return 0;


但是,当您使用C++时,与使用原始指针和new运算符相比,使用更好的方法是使用标准模板库的 std::vector container,它负责内部的所有分配和释放操作。以下是相关的“替换”行:

#include <vector> // This header defines the `std::vector` container
//...
    cin>>numberSide;
    std::vector<float> distance(numberSide);
    std::vector<Point> array(numberSide); 

然后,您不需要delete[]行,因为当 vector “超出范围”时, vector 的内存将自动释放。另外,您不需要真正更改任何其他代码,因为std::vector类具有[]运算符,该运算符可以按您希望的那样工作。

关于c++ - 我的动态数组出现问题-线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61002007/

相关文章:

c# - 使用单独的类,全局/静态类?

javascript - 创建类来处理元素的点击和其他事件

c++ - 关于通过 Get 和 Set 方法传递字符串

C++:成员变量的初始化

c++ - 谷歌oauth2.0,必需的参数丢失: grant_type

c++ - 强制资源管理器重新加载注册表值

c++ - 就地重新初始化对象

c++ - 使用指针翻转数组

具有具体方法的Python抽象类

c++ - 构造函数重载选择 cast operator 而不是 struct type