首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Widget wag = *new Widget()

Widget wag = *new Widget()
EN

Stack Overflow用户
提问于 2009-01-30 17:02:14
回答 5查看 360关注 0票数 3

我刚刚遇到一个C++开发工具包,它大量使用了这种非常奇怪的*new模式。我完全不明白他们为什么要那样做。

使用*new构造对象有什么意义,例如Widget wag = *new Widget();

更新:有趣的是,他们实际上是在做XPtr<T> p = *new T; --一定是某种智能指针魔法的语义。仍然没有多大意义。我相信SDK是高质量的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-01-30 17:11:52

它构造一个新对象,然后对其进行复制。指向原始对象的指针将被丢弃,因此可能存在内存泄漏。

不过,这并不一定会造成内存泄漏。可能是Widget维护了一个包含其所有实例的列表,并在其构造函数和析构函数中更新该列表。可能还有其他方法可以获得列表的内容。

但这看起来相当无意义。原因可能是由于对代码实际工作方式的误解。要找出代码为什么是这样编写的,最好的办法是去问编写它的人。在代码的注释中可能会有线索。你能透露更多关于你正在查看的代码的细节吗?

票数 4
EN

Stack Overflow用户

发布于 2009-01-30 17:10:31

也许他们正在尝试内存泄漏?使用new的默认实现,它将在堆上分配一个Widget,然后从它复制构造wag,然后它将立即泄漏新对象。

底线:不要模仿。我会用怀疑的眼光看待那个SDK。

编辑:如果这是在智能指针的上下文中完成的,那么他们肯定会保存指针以供以后删除。如果有一个XPtr模板可以做到这一点,你应该能够查看代码,看看它是不是在做这件事。SDK还应该在某个地方为您提供有关该构造的某种文档,因为它不是正常的,而且我也看不出它有什么好处。尽管如此,我仍然坚持我所说的:即使这不是一个保证泄漏,我仍然不会模仿它。

票数 4
EN

Stack Overflow用户

发布于 2009-01-30 17:06:50

这基本上是这样做的:

代码语言:javascript
运行
复制
Widget wag = *(new Widget());

// or
Widget wag;

我不知道这是否会适当地释放它。我猜它不会。

回答你的问题,我觉得它的设计选择很糟糕。也许他们想要开始使用指针,但后来变得丑陋起来。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/496305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档