尝试使用成员函数访问动态分配的成员变量时读取访问冲突



我有一个名为 person 的类,它有一个指向整数数组的指针,该数组在构造函数中使用"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;
};

人.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::person() {
    person(4);
}

您正在创建一个临时人员,并且不对它执行任何操作,而不是自己调用构造函数。 你真的想要这个:

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

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

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

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

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,然后尝试访问生成的未知地址的内存。未定义的行为 hi-jinks 接踵而至。

最新更新