打印矩阵后的分割错误,但在打印额外行(ostream<< opertator)后修复

时间:2018-05-05 23:19:52

标签: c++ segmentation-fault ostream

仅创建一个矩阵并将其打印出来后,我得到一个分段错误...我的矩阵的所有字符都被打印但是在最后一行之后我打印出来:

std::cout << endl;

我得到了分段错误。

我的代码:

部首:

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&lt;&lt;”“&lt;&lt; endl;”我不再有分割错误。

问题出在哪里?它看起来太简单但仍然,我收到一个错误。 (使用额外的cout&lt;&lt;“&lt;&lt;&lt;&lt;&lt; endl; line我可以继续并在我的任务中给出,但我相信我应该学习更多并找出问题所在。)

我看到here在某些情况下,我到达了记忆中我不应该去的区域,但是我知道并且我在询问我的具体代码,这就是为什么它不是重复的。此外,here还有一个类似的问题,但具体而且与我的问题无关。

1 个答案:

答案 0 :(得分:2)

这甚至可以编译吗?您缺少运营商的退货声明&lt;&lt;超载。您的实现也是错误的,您应该使用传递给函数的ostream进行打印,而不是直接使用cout然后返回它:

    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容器而不是使用原始指针。