在c ++中新的(动态分配)之前使用星号(*)

时间:2017-10-11 23:42:38

标签: c++

 board *gameBoard = new board(givenX,givenY,givenMineCount);

我知道上面的语句声明了一个指向board的对象指针。

但我想知道下面的陈述意味着什么。

 board gameBoard = *new board(givenX,givenY,givenMineCount);

3 个答案:

答案 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

该代码应:

  1. 进入无限while循环
  2. 分配一个新的myStruct对象
  3. 取消引用(正在复制它!
  4. 仅删除副本

或者不久之后:内存泄漏

好吧,我正在运行它,并且内存没有增加!

  创建参考时,

while (true) { myStruct& inner = *new myStruct(); delete &inner; } 良好。可以看到我定义了   &运算符(*new)的引用类型


可能出现的另一个问题(通常是供参考):

myStruct& inner
  

打印:原件:0份:1-2

     

危险!


TL; DR

  • // 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在创建参考类型方面是
  • 要小心,在将引用类型分配给值变量时,它会 制作副本