我的代码通过编译器,但我对指针的概念有疑问。
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数组的新对象前面?
答案 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();
与您的问题无关,但如果maxRow
或maxCol
大于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