尝试将构造函数设置为 0 - c++ 的未处理异常
Unhandled exception trying to set constructor to 0 - c++
当我尝试将构造函数数组设置为零时,我收到一个未经处理的异常。我认为问题出在构造函数上,但我不确定。我删除了不必要的代码并重现了错误。感谢您的反馈。
错误显示: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();
} //
}
相关文章:
- 在c++中实现LinkedList时,应出现未处理的错误
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 在C++程序中使用的迭代器中未处理的异常
- 在 ******.exe 中0x00000000772CA267 (ntdll.dll) 处未处理的异常:0xC0000
- 未处理的异常与 cudaMemcpy2D
- 处理未处理的异常更改C++
- for 循环中未处理的异常
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 为什么此代码导致未处理的异常失败
- 瓦尔格林德:注意到但未处理的国际奥克特尔;是否有必要处理以及如何找到?
- 在OpenCV_core310.dll中使用findContours函数时,OpenCV引发未处理的异常
- 0x0F50DF58:0xC0000005:访问冲突读取位置0x0047CA04时未处理的异常
- 使用 getline 时未处理的异常
- 错误 : 异常 : 引发未处理的异常: 读取访问冲突.0xDDDDDDDD临时温度
- 核心消息传递中未处理的异常.dll在程序关闭期间
- 在 Hello World.exe 中0x0F828F0E (ucrtbased.dll) 处未处理的异常: 0xC00
- 从向量中删除元素时未处理的异常
- QML:多个键按 /发布后未处理一些键
- C++ 程序中双链表的未处理异常