在c++中,在new(动态分配)之前使用星号(*)
Usage of asterisk(*) before new(dynamic allocation) in c++
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;
}
该代码应该是:
- 进入一个无限while循环
- 分配一个新的myStruct对象
- 取消引用它(导致它被复制!)
- 仅删除副本
或者很快:内存泄漏
好吧,我在运行这个,但内存没有增加!
*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
对于创建引用类型来说是很好的- 将引用类型分配给值变量时要小心制作副本
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 在c++中,在new(动态分配)之前使用星号(*)
- 如何在C++中使用"new"动态分配向量数组?
- 在C++中使用带有二进制搜索的new动态内存分配
- 在动态分配中,在关键字new之前使用Why(unsigned char*)
- 在C++中,如何在没有动态分配(即NEW)的情况下将对象初始化为对象内部的指针
- 当我们可以使用=运算符为字符串赋值时,为什么要在赋值之前使用new运算符为字符串动态分配内存
- 如何在c++中使用new为类动态分配内存
- 内存管理:使用new操作符进行数组和动态分配
- 在c++中由new和delete动态分配
- 从指针向量中删除元素,并释放先前通过new操作符分配的动态内存