C++ Project70.exe中0x0F4D514F(vcruntime140d.dll)处引发异常:0xC0000005:访问冲突写入位置0xDDDD
我正在尝试更改在具有地址的堆中创建的类成员的值,并将错误记录在下面C++ Project70.exe中0x0F4D514F(vcruntime140d.dll)处引发异常:0xC0000005:访问冲突写入位置0xDDDD,c++,class,new-operator,undefined-behavior,memory-mapped-files,C++,Class,New Operator,Undefined Behavior,Memory Mapped Files,我正在尝试更改在具有地址的堆中创建的类成员的值,并将错误记录在下面 class class2 { private: string String = "x"; public: string function() { return String; } }; class class1 { public: string String; class2* i; void address(class2* x) { x
class class2 {
private:
string String = "x";
public:
string function() {
return String;
}
};
class class1 {
public:
string String;
class2* i;
void address(class2* x) {
x = new class2();
i = x;
}
void function(string x) {
String = x;
}
};
int main() {
int len;
cin>>len;
class1 **Class1 = new class1*[len];
for(int i = 0; i < len; i++) {
Class1[i] = new class1[i];
}
Class1[0]->address(Class1[0]->i);
Class1[0]->function(Class1[0]->i->function());
cout<<Class1[0]->String;
}
类2{
私人:
string=“x”;
公众:
字符串函数(){
返回字符串;
}
};
一班{
公众:
字符串字符串;
类别2*i;
无效地址(class2*x){
x=新类2();
i=x;
}
void函数(字符串x){
字符串=x;
}
};
int main(){
内伦;
cin>>len;
class1**class1=新class1*[len];
对于(int i=0;i地址(Class1[0]->i);
Class1[0]->function(Class1[0]->i->function());
这是新接线员的电话
Class1[i] = new class1[i];
是无效的,你是说
Class1[i] = new class1;
注意这个成员的功能
void address(class2* x) {
x = new class2();
i = x;
}
没有太大意义,因为传递给函数的参数未被使用。此新运算符的调用
Class1[i] = new class1[i];
是无效的,你是说
Class1[i] = new class1;
注意这个成员的功能
void address(class2* x) {
x = new class2();
i = x;
}
没有意义,因为没有使用函数的传递参数。
好的,让我们一步一步地说明错误。很明显,你正在学习C++,所以我会尝试给那些读者写信。
int len;
cin>>len;
1) 读入标准长度。还没有严重问题。您可以检查以确保它不是负值或零,但我们现在就让它消失。我们将假装“len=3”,然后从这里继续
class1 **Class1 = new class1*[len];
2) 您创建了一个指向class1的指针,名为class1。我不能说我喜欢您的命名方案,但让work也通过它,并将class1设置为指向class1的指针数组。到目前为止还不错。如果len
为零或负,您可以想象您可能遇到的问题。请注意,这些指针的内存中没有b即使是初始化的,也只是放在一边,用来存放你以后放进去的东西
for(int i = 0; i < len; i++) {
Class1[i] = new class1[i];
}
首先,这是非常误导的。它最好写为Class1[0][0]。地址(Class1[0][0].i)
;其次,将“i”传递到一个函数中,该函数的唯一目的是写入恰好是您刚刚传入的参数的成员变量,这是毫无意义的。只需写入成员变量即可
第三:轰。我们刚刚踩上了零长阵列地雷。但并没有失去一切
您可以通过相对较少的更改来挽救这一点
Class1[i]=newclass1[len];
将为您提供分配网格(3,3,3),而不是三角形(0,1,2)
- 每次调用
new
都需要调用delete
,最好是在该类的析构函数中。析构函数非常棒。您可以在地址中调用new
(删除它的参数,您不需要它),因此需要在某个地方调用delete。此外,您应该在构造函数中将i
设置为null ptr,以免意外尝试删除无效的内容
- 对于每个对
new[]
的调用,您都需要调用delete[]
。您在一个数组中循环调用new[]
,因此您需要在该数组中循环调用delete[]
来清理它
<> LI>变量名。我猜英语不是你的第一语言,你也在学习C++,所以我理解。但是你的函数和变量名最多是没有意义的(<代码> Cult1< /Cube >,<代码> Cult2,<代码> i>代码>,<代码> x>代码>,并且在最坏的情况下误导。(
address
不接受任何东西的地址,它创建了一些东西)。即使没有太多的内容,你至少可以使用“InnerClass”、“OuterClass”、“message”、“createInner”、“innerPtr”等名称,它们也不难理解
我们是什么,数学家?!我们有描述事物所需的所有空间,所以要有描述性。数学家过去被限制在黑板上,不得不用手写所有东西,因此使用(过于)简洁(外人无法理解)的压力很大符号是可以理解的…但是现在?他们没有那个借口。我也在看着你们物理学家!是的,你们穿着实验室的外套!
学习触摸式。程序员最后打字很多,从屏幕到键盘看,然后死掉你的打字速度。
好的,让我们一步一步地说明什么出错了。很明显你在学习C++,所以我会尝试给那些读者写信。
int len;
cin>>len;
1) 读入标准长度。还没有严重问题。您可以检查以确保它不是负值或零,但我们现在就让它消失。我们将假装“len=3”,然后从这里继续
class1 **Class1 = new class1*[len];
2) 您创建了一个指向class1的指针,名为class1。我不能说我喜欢您的命名方案,但让work也通过它,并将class1设置为指向class1的指针数组。到目前为止还不错。如果len
为零或负,您可以想象您可能遇到的问题。请注意,这些指针的内存中没有b即使是初始化的,也只是放在一边,用来存放你以后放进去的东西
for(int i = 0; i < len; i++) {
Class1[i] = new class1[i];
}
首先,这是非常误导的。它最好写为Class1[0][0]。地址(Class1[0][0].i)
;其次,将“i”传递到一个函数中,该函数的唯一目的是写入恰好是您刚刚传入的参数的成员变量,这是毫无意义的。只需写入成员变量即可
第三:轰。我们刚刚踩上了零长阵列地雷。但并没有失去一切
您可以通过相对较少的更改来挽救这一点
Class1[i]=newclass1[len];
将为您提供分配网格(3,3,3),而不是三角形(0,1,2)
- 对于
new
的每次调用,您都需要调用delete
,最好是在该类的析构函数中