c ++将2D数组分配给Object

时间:2014-04-01 14:52:30

标签: c++ arrays

我的代码通过编译器,但我对指针的概念有疑问。

main.cpp中:

int main(int argc, const char * argv[])
{
    int inputPuzzle[3][3];

    std::cout << "Set the puzzle: " << "\n";
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            std::cin >> inputPuzzle[i][j];
        }
    }

    puzzle puzzle_1 = *new puzzle(inputPuzzle);
    puzzle_1.display();

    return 0;
}

puzzle.h:

class puzzle
{
    public:
        puzzle();
        puzzle(int [][maxCol]);
        ~puzzle();
    public:
        int puzz [maxRow][maxCol];
};

puzzle.cpp:

puzzle::puzzle(int a[][maxCol])
{
    for (int i = 0; i < maxRow; i++) {
        for (int j = 0; j < maxCol; j++) {
            puzz[i][j] = a[i][j];
        }
    }
}

我的问题是关于声明:puzzle puzzle_1 = *new puzzle(inputPuzzle);

为什么我要添加&#34; *&#34;在我想要分配2D数组的新对象前面?

2 个答案:

答案 0 :(得分:4)

你正在编程C ++,其中new返回一个指针。使用星号时,它是取消引用操作符,基本上将指针转换为非指针。

使用这样的解除引用运算符意味着您实际上丢失new创建的指针,并且您无法释放delete所分配的内存,当然,导致内存泄漏。

为避免丢失指针,必须将变量声明为指针:

puzzle* puzzle_1 = new puzzle(inputPuzzle);

然后在访问成员时必须使用指针成员选择器操作符:

puzzle_1->display();

并且,为了避免泄漏内存,当你完成指针时,你必须delete它:

delete puzzle_1;

然而,在C ++中,很少需要使用指针;而只是将其声明为正常变量:

puzzle puzzle_1(inputPuzzle);
puzzle_1.display();

与您的问题无关,但如果maxRowmaxCol大于3,那么您将从内存中读取数组inputPuzzle。这将导致undefined behavior

答案 1 :(得分:2)

这里最重要的部分是new关键字。它将指针返回给新实例化的对象。查看Dynamic memory allocation以获取更多信息,了解指针的使用时间和方式,以及new关键字的工作原理。

现在,我们知道new关键字返回一个指针,并且您希望获取一个对象而不是指针,因此您必须取消引用指针。

现在有两个正确的解决方案:

// without pointers
puzzle puzzle_1(inputPuzzle); // initialize the object without going through a copy 
puzzle_1.display();

// with pointers
puzzle *puzzle_1 = new puzzle(inputPuzzle);
puzzle_1->display(); //notice that we used -> here as it's a pointer
// do stuffs here
delete puzzle_1; // free the memory