【发布时间】:2022-01-05 01:09:53
【问题描述】:
我从一本名为 C++ Primer Plus 的书中读到这部分内容(第 400 页。第 8 章 - 函数冒险)
第二种方法是使用
new创建新存储。您已经看到new为字符串创建空间并且函数返回指向该空间的指针的示例。 以下是你应该如何与推荐人做类似的事情:
const free_throws & clone(free_throw & ft)
{
free_throws * ptr;
*ptr = ft;
return *ptr;
}
第一条语句创建了一个无名的
free_throw结构。指针ptr指向结构,所以*ptr就是结构。代码似乎返回了结构,但函数声明表明该函数确实返回了对该结构的引用。你可以这样使用这个函数:
free_throw & jolly = clone(three);
这使得
jolly成为对新结构的引用。这种方法存在一个问题:当不再需要内存时,您应该使用delete来释放new分配的内存。对clone()的调用隐藏了对new的调用,从而更容易忘记稍后使用删除。
我的疑惑:
据我所知,对于最佳实践,您不应该在不初始化指针的情况下取消引用指针,并且声明指向某个结构的指针只会为指针分配空间,而不是为整个结构分配空间,您必须为结构单独分配空间。
根据这本书,声明指针会自动为整个结构分配空间,并且指针在没有初始化的情况下被取消引用。
调用函数时如何自动调用new运算符?
【问题讨论】:
-
“在没有初始化的情况下永远不要取消引用指针”不仅仅是只是最佳实践——它是最佳实践完全避免使用指针 .取而代之的是 use references 和 smart-pointers。
-
你的分析是正确的。 - 买一本新的/更好的书。
*ptr = ft;是未定义的行为,因为ptr未初始化。 -
添加到 Richard 的评论中,我想提一下,它也完全失败了 const 正确性,因为我们从
const free_throws&分配了一个free_throws&,顺便说一下,这是对临时的引用.C++ Primer Plus是什么?那是C++ Primer的抢钱山寨版吗?无论哪种方式,我都会改用 Lippman、Lajoie 和 Moo 所著的C++ Primer这样的正版书籍 -
...更不用说它谈论
new,但忘记实际使用它。
标签: c++ pointers struct reference new-operator