board *gameBoard = new board(givenX,givenY,givenMineCount);
我知道上面的语句声明了一个指向board的对象指针。
但我想知道下面的陈述意味着什么。
board gameBoard = *new board(givenX,givenY,givenMineCount);
答案 0 :(得分:2)
在两个陈述中," new" keyword返回指向要分配的对象的指针。第二个语句起作用的原因是因为如果在指针之前放置一个*,则取消引用该指针,简单来说,它指向指针所指向的对象。但正如Mooing Duck所说,如果你不理解这一点,你应该一起避免使用新的关键词。
编辑:回答这意味着什么?它意味着您分配一个板对象然后取消引用它并在您的变量gameBoard中保存一个新副本。基本上给你两个Board对象的副本。
答案 1 :(得分:1)
new board(givenX,givenY,givenMineCount);
执行两件事:在内存中创建一个board
对象并返回创建它的地址。
在第二个语句中,gameBoard
是一个包含board
对象的堆栈变量。正如我之前提到的,new
返回一个地址,并且通过使用*
运算符,您基本上“解释”(实际技术术语是解除引用)作为董事会的地址。也就是说,这样做似乎正在复制并将其分配给boardGame
,并留在内存中留下new
创建的内容。
答案 2 :(得分:0)
我是c ++的新手,但我认为像我这样的初学者和 asker 这样的初学者缺少更多细节。
注意:此答案包含像我这样的新手的详细信息。高级c ++开发人员可能会发现此帖子有些混乱!
懒惰? tl; dr结尾
是否总是使用php artisan config:clear
php artisan view:clear
php artisan route:clear
php artisan cache:clear
php artisan clear-compiled
创建对象并创建对象的两个副本? (一个永远不会被删除)
让我们检查一下:
正如其他人所解释的,*new
只是一个语句中new的快捷方式,然后使用星号运算符(*)取消引用
考虑以下包含单个数字的结构:
*new
让我们创建一个SINGLE对象,然后多次取消引用它:
struct myStruct
{
public:
myStruct() { innerNumber = 0; }
myStruct(uint16_t num) {
innerNumber = num;
}
uint16_t innerNumber;
};
打印: 1-2-3
很酷=](危险)
因此,如果我们正确地获得了它,那么使用myStruct* obj = new myStruct();
myStruct obj1 = *obj;
myStruct obj2 = *obj;
myStruct obj3 = *obj;
obj1.innerNumber = 1;
obj2.innerNumber = 2;
obj3.innerNumber = 3;
printf("%d-%d-%d\n", obj1.innerNumber, obj2.innerNumber, obj3.innerNumber);
总是一个坏主意,因为它总是会导致内存泄漏!
让我们看看它的作用:
*new
该代码应:
或者不久之后:内存泄漏
好吧,我正在运行它,并且内存没有增加!
创建参考时,
while (true) { myStruct& inner = *new myStruct(); delete &inner; }
是良好。可以看到我定义了 &运算符(*new
)的引用类型
可能出现的另一个问题(通常是供参考):
myStruct& inner
打印:原件:0份:1-2
危险!
// Create a reference
myStruct& inner = *new myStruct();
inner.innerNumber = 0;
// WHAT WILL HAPPEN HERE?
myStruct whatAmI1 = inner;
myStruct whatAmI2 = inner;
whatAmI1.innerNumber = 1;
whatAmI2.innerNumber = 2;
printf("Original: %d Copies: %d-%d\n", inner.innerNumber, whatAmI1.innerNumber, whatAmI2.innerNumber);
对于创建值类型不好 *new
在创建参考类型方面是好