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

Usage of asterisk(*) before new(dynamic allocation) in c++

本文关键字:new 动态分配 c++      更新时间:2023-10-16
board *gameBoard = new board(givenX,givenY,givenMineCount);

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

但我想知道下面的陈述是什么意思。

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

在这两个语句中,"new"关键字都返回一个指向正在分配的对象的指针。第二条语句之所以有效,是因为如果你在指针之前加上一个*,你就可以取消引用该指针,简单地说,它会给你指针指向的对象。但正如Mooing Duck所说,如果你不理解这一点,你应该一起避免使用新的关键字。

编辑:回答这意味着什么?这意味着你分配了一个棋盘对象,然后取消引用它,并在变量gameBoard中保存一个新副本。本质上是给你两份Board对象的副本。

简而言之,new board(givenX,givenY,givenMineCount);执行两件事:在内存中创建一个board对象并返回创建它的地址。

在第二条语句中,gameBoard是一个堆栈变量,它包含一个board对象。正如我之前提到的,new返回一个地址,通过使用*运算符,您基本上将地址"解释"(实际的技术术语是取消引用)为一个板。也就是说,这样做似乎是制作一个副本并将其分配给boardGame,并将使用new创建的内容留在内存中。

我是c++的新手,但我认为对于像我这样的初学者和请求者来说,这里缺少了额外的细节。

注意:这个答案包含了像我这样的新手的详细信息。高级c++开发人员可能会觉得这篇文章有点令人困惑

懒惰tl;dr在最后

是否总是使用*new创建和对象会创建对象的两个副本?(一个永远不会被删除)

让我们看看这个:

正如其他人所解释的,*new只是在一个语句中指向new的快捷方式,然后用星号运算符(*)取消引用它

考虑以下包含单个数字的结构:

struct myStruct
{
public:
myStruct() { innerNumber = 0; }
myStruct(uint16_t num) {
innerNumber = num;
}
uint16_t innerNumber;
};

让我们创建一个SINGLE对象,并多次取消引用它:

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-%dn", obj1.innerNumber, obj2.innerNumber, obj3.innerNumber);

打印:1-2-3

相当酷=](而且很危险)


因此,如果我们得到正确的答案,使用这里已经提到的*new总是一个坏主意,它总是会导致内存泄漏!!

让我们看看它的作用:

while (true) {
myStruct& inner = *new myStruct();
delete &inner;
}

该代码应该是:

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

或者很快:内存泄漏

好吧,我在运行这个,但内存没有增加!

*new在创建引用时GOOD。你可以看到我定义了由&操作员(myStruct& inner)


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

// 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-%dn", inner.innerNumber, whatAmI1.innerNumber, whatAmI2.innerNumber);

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

危险!


TL;DR

  • *new不适合创建值类型
  • *new对于创建引用类型来说是很好的
  • 将引用类型分配给值变量时要小心制作副本