打印矩阵后出现分段错误,但在打印额外行后修复(ostream << 运算符)
segmentation error after printing matrix, but is fixed after printing extra line (ostream << opertator)
仅创建一个矩阵并将其打印出来后,我得到一个分段错误...我的矩阵的所有字符都被打印但在最后一行之后我打印:
std::cout << endl;
我得到了分割错误。
我的代码:
Header:
class Board{
private:
struct coord {
int x;
int y;
};
coord _coord;
char** board;
int size;
public:
Board(int v);
//~Board();
friend std::ostream& operator<<(std::ostream& os, Board const &b);
};
我的 CPP 代码:
Board::Board(int v)
{
size = v;
board = new char* [size];
for (int i=0; i<size; i++)
{
board[i] = new char[size];
for(int j = 0 ; j < size ; j++){
board[i][j] = '*';
}
}
}
ostream& operator<<(std::ostream& os, Board const &b)
{
for(int i = 0 ; i < b.size ; i++){
for(int j = 0 ; j < b.size ; j++){
cout << b.board[i][j] << " ";
}
cout << endl; // when (i == 3) the debug tells me after this I am thrown out
}
//cout << " " << endl;
}
我的主要:
#include "Board.h"
#include <iostream>
#include <vector>
//#include <map>
using namespace std;
int main() {
Board board1{4}; // Initializes a 4x4 board
cout << board1 << endl;
return 0;
}
然后我得到:
* * * *
* * * *
* * * *
* * * *
Segmentation fault
但如果我反驳:"//cout << " " << endl;" 我不再有分段错误。
问题出在哪里?它看起来太简单了,但仍然出现错误。 (有了额外的 cout << " " << endl; 行,我可以继续并完成我的任务,但我相信我应该学习更多并找出问题所在)
我看到 here that in whole in some situation that I am getting to an area in the memory that I am not supposed to get to, but that I know and I am asking on my specific code, that's why it is not a duplicate. Also, here 有一个类似的问题,但很具体,与我的问题无关。
这甚至可以编译吗?您缺少来自 operator<< 重载的 return 语句。您的实现也是错误的,您应该使用传递给函数的 ostream 进行打印,而不是直接使用 cout 然后 return 它:
friend ostream& operator<<(std::ostream& os, Board const &b)
{
for (int i = 0; i < b.size; i++) {
for (int j = 0; j < b.size; j++) {
os << b.board[i][j] << " ";
}
os << endl; // when (i == 3) the debug tells me after this I am thrown out
}
os << " " << endl;
return os;
}
cout 是可用的 ostream 对象之一(还有 cerr 和 clog)并且您希望您的操作员支持所有这些对象。话虽如此,您应该使用 STL 容器而不是使用原始指针。
仅创建一个矩阵并将其打印出来后,我得到一个分段错误...我的矩阵的所有字符都被打印但在最后一行之后我打印:
std::cout << endl;
我得到了分割错误。
我的代码:
Header:
class Board{
private:
struct coord {
int x;
int y;
};
coord _coord;
char** board;
int size;
public:
Board(int v);
//~Board();
friend std::ostream& operator<<(std::ostream& os, Board const &b);
};
我的 CPP 代码:
Board::Board(int v)
{
size = v;
board = new char* [size];
for (int i=0; i<size; i++)
{
board[i] = new char[size];
for(int j = 0 ; j < size ; j++){
board[i][j] = '*';
}
}
}
ostream& operator<<(std::ostream& os, Board const &b)
{
for(int i = 0 ; i < b.size ; i++){
for(int j = 0 ; j < b.size ; j++){
cout << b.board[i][j] << " ";
}
cout << endl; // when (i == 3) the debug tells me after this I am thrown out
}
//cout << " " << endl;
}
我的主要:
#include "Board.h"
#include <iostream>
#include <vector>
//#include <map>
using namespace std;
int main() {
Board board1{4}; // Initializes a 4x4 board
cout << board1 << endl;
return 0;
}
然后我得到:
* * * *
* * * *
* * * *
* * * *
Segmentation fault
但如果我反驳:"//cout << " " << endl;" 我不再有分段错误。
问题出在哪里?它看起来太简单了,但仍然出现错误。 (有了额外的 cout << " " << endl; 行,我可以继续并完成我的任务,但我相信我应该学习更多并找出问题所在)
我看到 here that in whole in some situation that I am getting to an area in the memory that I am not supposed to get to, but that I know and I am asking on my specific code, that's why it is not a duplicate. Also, here 有一个类似的问题,但很具体,与我的问题无关。
这甚至可以编译吗?您缺少来自 operator<< 重载的 return 语句。您的实现也是错误的,您应该使用传递给函数的 ostream 进行打印,而不是直接使用 cout 然后 return 它:
friend ostream& operator<<(std::ostream& os, Board const &b)
{
for (int i = 0; i < b.size; i++) {
for (int j = 0; j < b.size; j++) {
os << b.board[i][j] << " ";
}
os << endl; // when (i == 3) the debug tells me after this I am thrown out
}
os << " " << endl;
return os;
}
cout 是可用的 ostream 对象之一(还有 cerr 和 clog)并且您希望您的操作员支持所有这些对象。话虽如此,您应该使用 STL 容器而不是使用原始指针。