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

时间:2016-05-20 22:41:16

标签: c++ arrays

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

person.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;
}

3 个答案:

答案 0 :(得分:2)

public string Username { get; set; }

您正在创建一个临时人员,而不是使用它做任何事情,而不是自己调用构造函数。你真的想要这个:

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

答案 1 :(得分:0)

您的默认构造函数没有按照您的想法执行。

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

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

答案 2 :(得分:0)

irb(main):039:0* 
irb(main):040:0* Rails.cache.fetch("development_test") do
irb(main):041:1* 'hi'
irb(main):042:1> end
Cache read: development_test
Cache fetch_hit: development_test
=> "hi"
irb(main):043:0> Rails.cache.fetch("development_test")
Cache read: development_test
=> "hi"
irb(main):044:0> Rails.cache.fetch("development_test") do
irb(main):045:1* {'x' => 3}
irb(main):046:1> end
Cache read: development_test
Cache fetch_hit: development_test
=> "hi"
irb(main):047:0> Rails.cache.fetch("development_test")
Cache read: development_test
=> "hi"
irb(main):048:0> 

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

person()

它创建了一个使用person::person() { person(4); } 构造函数创建的person类型的临时匿名变量。这个匿名人员在从person(int length);构造函数返回时被销毁,导致person()有效地未初始化。

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

mark.getval(1)

int person::getval(int a) { return *(numlist + a); } 添加到未初始化的a,然后尝试在生成的未知地址处访问内存。未定义的行为随之而来。