【问题标题】:Read Access Violation When Trying to Access Dynamically Allocated Member Variable with Member Function尝试使用成员函数访问动态分配的成员变量时读取访问冲突
【发布时间】:2016-09-18 07:41:10
【问题描述】:

我有一个名为 person 的类,它有一个指向 int 数组的指针,该数组在构造函数中使用“new”关键字动态分配。但是,当我尝试通过成员函数“person::getval”中的指针访问此数组时,我收到了读取访问冲突。关于我做错了什么有什么想法吗?我认为这可能与范围有关,因为如果我从构造函数内部访问“numlist”数组,则没有问题。谢谢。

人.h

    class person {
public:
    person();
    person(int length);
    ~person();
    int getval(int a);
    void setval(int a, int b);
private:
    int* numlist;
    int listlength;
    int age;

};

person.cpp

#include "stdafx.h"
#include "person.h"

person::person() {
    person(4);
}
person::person(int length){
    age = 16;
    numlist = new int[length];
    listlength = length;
    for (int k = 0; k < length; k++) {
        numlist[k] = 0;
    }
}
person::~person() {
    delete[] numlist;
}
int person::getval(int a) {
    return *(numlist + a);          //READ ACCESS VIOLATION OCCURS HERE
}

void person::setval(int position, int val) {
    *(numlist + position) = val;
}

主要

#include "stdafx.h"
#include "person.h"
#include <iostream>
using namespace std;


int main()
{
    person mark;
    cout << mark.getval(1)<<endl;
    int x;      //hold output
    cin >> x;
    return 0;
}

【问题讨论】:

  • 这个:person(4); 它没有做你认为它正在做的事情

标签: c++ arrays


【解决方案1】:
person::person() {
    person(4);
}

您正在创建一个临时人员并且没有对它做任何事情,也没有调用自己的构造函数。你真的想要这个:

person::person() : person(4) {}

【讨论】:

  • 您发布的更正版本到底发生了什么?我以前没见过这种语法。
  • “初始化列表”
【解决方案2】:

你的默认构造函数没有做你认为它正在做的事情。

person::person() {
    person(4);
}

我猜你认为上面的默认构造函数正在使用大小为4 的数组初始化person 实例。但是,person(4) 正在构造函数的主体中创建一个临时对象实例,该实例超出范围并在构造函数主体的末尾被销毁。这会为默认构造的 person 对象留下一个尚未动态分配的数组。

【讨论】:

    【解决方案3】:
    person mark;
    

    调用person() 构造函数。我在下面列出了这个构造函数:

    person::person() {
        person(4);
    }
    

    它创建一个使用person(int length); 构造函数创建的person 类型的临时匿名变量。这个匿名的人在从person() 构造函数返回时被销毁,而mark 实际上没有初始化。

    因此,在创建 mark 时创建和销毁的 person 已为 numlist 分配了存储空间。 mark 得到了杰克,所以mark.getval(1),下面

    int person::getval(int a) {
        return *(numlist + a);
    }
    

    a 添加到未初始化的numlist,然后尝试访问生成的未知地址处的内存。随之而来的是未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      相关资源
      最近更新 更多