尝试使用成员函数访问动态分配的成员变量时读取访问冲突
Read Access Violation When Trying to Access Dynamically Allocated Member Variable with Member Function
我有一个名为 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 接踵而至。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查