尝试将构造函数设置为 0 - c++ 的未处理异常

Unhandled exception trying to set constructor to 0 - c++

本文关键字:c++ 未处理 异常 构造函数 设置      更新时间:2023-10-16

当我尝试将构造函数数组设置为零时,我收到一个未经处理的异常。我认为问题出在构造函数上,但我不确定。我删除了不必要的代码并重现了错误。感谢您的反馈。

错误显示:0x0fa4025时未处理的异常:访问冲突写入位置0x0000。

源:

#include <iostream>
#include <vector>
#include "header.h"
using namespace std;
foo::foo(int b[3][3])
{
    memset(b, 0, sizeof b);
}
void foo::makeMove()
{
    board[1][1] = 1;
}
void foo::print()
{
    for (int i = 0; i < 2; i++){
        for (int j = 0; j < 2; j++){
            cout << board[i][j];
        }
    }
}

页眉:

class foo
{
public:
    foo::foo(int[3][3] = 0);
    void makeMove();
    void print();
private:
    int board[3][3];
};

主要:

#include "header.h" // include definition of class TicTacToe
int main()
{
    foo g; // creates object g of class TicTacToe 
    g.makeMove(); // invokes function makeMove
    g.print();
} //

结束主

foo::foo(int[3][3] = 0);

参数的默认值(指针而不是数组)已设置为 0 。 当没有参数传递给构造函数时,它是无效的。因此,这不是合理的默认值。

然后通过 memset 写入它,这会调用未定义的行为。我什至不明白这个设计的意义。 为什么要使用外部数组并将其设置为所有 0? 您的类有自己的数组board 。 使用它。

接下来,意识到这是C++,并且您正在编写代码,就好像它是 C 一样。 你有向量、std::copy等。

发生这种情况是因为指定的指针默认值(当然,指向数组):foo::foo(int[3][3] = 0); .因此,您正在尝试memset 0x0。

构造函数写入b而不检查它是否为 0。 默认b为 0,因此调用未定义的行为。

在 CTOR 中的memset之前添加空检查。

您创建了一个类 foo 的对象

foo g;

使用默认参数等于 0 的默认构造函数。

foo::foo(int[3][3] = 0);

当您尝试使用 adrress 0 访问内存以填充它时

foo::foo(int b[3][3])
{
    memset(b, 0, sizeof b);
}

在我看来,这个构造函数

foo::foo(int b[3][3])
{
    memset(b, 0, sizeof b);
}

没有任何意义,因为它处理局部变量 b。我想你想填写数据成员 int board[3][3];不是局部变量。

我认为您的主要错误是定义一个成为"默认"构造函数的构造函数。这是因为您为其提供了默认值,因此可以在没有参数的情况下调用它。你的循环也是错误的。见下文。

#include <iostream>
#include <vector>
#include <memory.h>
using namespace std;
class foo
{
public:
    void makeMove();
    void print();
private:
    int board[3][3] { { 0 }, { 0 }, { 0 } };
};

void foo::makeMove()
{
    board[1][1] = 1;
}
void foo::print()
{
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            cout << board[i][j];
        }
        cout << endl;
    }
}
int main()
{
    foo g; // creates object g of class TicTacToe 
    g.makeMove(); // invokes function makeMove
    g.print();
} //

}