簡體   English   中英

試圖將構造函數設置為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您默認b為0,因此調用未定義的行為。

在之前添加空校驗memset在CTOR。

您創建了foo類的對象

foo g;

使用默認構造函數,默認參數等於0。

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

當您嘗試使用內存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();
} //

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM