Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Project70.exe中0x0F4D514F(vcruntime140d.dll)处引发异常:0xC0000005:访问冲突写入位置0xDDDD_C++_Class_New Operator_Undefined Behavior_Memory Mapped Files - Fatal编程技术网

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
    ,最好是在该类的析构函数中