打印矩阵后出现分段错误,但在打印额外行后修复(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 容器而不是使用原始指针。