【问题标题】:Classes and Dynamically Allocated Array- Read access violation类和动态分配的数组 - 读取访问冲突
【发布时间】:2020-04-07 01:09:24
【问题描述】:

我的问题的要点: 确保在构造函数中初始化动态数组,而不是在类的主体中。


当我尝试为本地 int 变量分配数组的值时,我遇到了读取访问冲突。数组实际上是一个在另一个类中动态分配和初始化的指针。我不确定我错过了什么,如果有人可以帮助我,我将不胜感激:

编辑:我已经修复了一个较早的错误,即我从索引中调用了数组,但我仍然收到读取错误。

Edit#2:我在下面不使用指针的情况下尝试了相同的 sn-p 代码,它可以工作。但是,当我动态分配指针时,我的程序崩溃了。

#include <iostream>
using namespace std;


class Discretization {
public:
    int Number_Elements, Number_Nodes;
    int *Ji = new int [Number_Elements];
    int* Jj = new int[Number_Elements];
    double* x = new double[Number_Nodes], * y = new double[Number_Nodes];

    Discretization() {

        Number_Elements = 8;
        Number_Nodes = 9;


        Ji[0] = 1; Jj[0] = 2;
        Ji[1] = 2; Jj[1] = 3;
        Ji[2] = 3; Jj[2] = 4;
        Ji[3] = 2; Jj[3] = 5;
        Ji[4] = 3; Jj[4] = 6;
        Ji[5] = 6; Jj[5] = 7;
        Ji[6] = 7; Jj[6] = 8;
        Ji[7] = 7; Jj[7] = 9;

        x[0] = -8.327; y[0] = -35.040;
        x[1] = 0; y[1] = -35.040;
        x[2] = 0; y[2] = 0;
        x[3] = -8.327; y[3] = 0;
        x[4] = 8.327; y[4] = -35.040;
        x[5] = 8.327; y[5] = 0;
        x[6] = 25.778; y[6] = 0;
        x[7] = 25.778; y[7] = 5.986;
        x[8] = 25.778; y[8] = -5.986;

    }
};


class GeometricProperties : public Discretization {

public:


    void AddVar(int Current_Element) {


        int Node_m = Ji[Current_Element] - 1; //Returns the first node of the element
        int Node_n = Jj[Current_Element] - 1; //Returns the second node of the element


        //Retruns local x coordinate of node m and n
        double Node_m_x = x[Node_m];
        double Node_n_x = x[Node_n];
    }

    GeometricProperties() {

        AddVar(1);
    }
};



int main() {

    GeometricProperties myobj;


    return 0;
}

【问题讨论】:

  • Ji 具有从 01 的有效索引。 2 不是有效索引。
  • 是的,对不起。我已经解决了这个问题,但是编译后仍然出现读取访问错误
  • 好吧,这不是您访问n 元素数组的索引n 的唯一地方。 n 元素数组的有效索引是 0n - 1
  • 哪个变量有这个值?该变量应该具有什么正确值?该变量应该在什么时候具有正确的值?转到代码中应该分配正确值的位置,找出为什么没有分配正确值。

标签: c++


【解决方案1】:

GeometricProperties的构造函数调用AddVar(2),也就是说CurrentElement是2。但是Ji的大小是2,所以只能索引0和1。

这意味着您对Ji 的索引超出了范围。这是 UB,您的程序可能会崩溃。

您需要修复所有此类 UB 示例。即使您的程序在从未运行过的代码中有 UB,程序也是错误的。

【讨论】:

  • 是的,感谢您指出这一点。我已修复它,但我仍然遇到读取访问错误
  • Jj[2] = 3; 怎么样?
  • 嘿@Cigien,我已将代码更新为我要解决的实际示例。如果您使用静态数组,它可以工作,但是当我切换到动态数组时会崩溃
  • 你还没有初始化Number_Elements。从中读取的是UB。
  • 未定义的行为。这意味着程序可以做它想做的任何事情。它甚至可以给出正确的答案:)
猜你喜欢
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2015-03-28
  • 2016-09-18
  • 2020-04-22
  • 1970-01-01
相关资源
最近更新 更多