我刚刚遇到一个C++开发工具包,它大量使用了这种非常奇怪的*new
模式。我完全不明白他们为什么要那样做。
使用*new构造对象有什么意义,例如Widget wag = *new Widget();
更新:有趣的是,他们实际上是在做XPtr<T> p = *new T;
--一定是某种智能指针魔法的语义。仍然没有多大意义。我相信SDK是高质量的。
发布于 2009-01-30 17:11:52
它构造一个新对象,然后对其进行复制。指向原始对象的指针将被丢弃,因此可能存在内存泄漏。
不过,这并不一定会造成内存泄漏。可能是Widget
维护了一个包含其所有实例的列表,并在其构造函数和析构函数中更新该列表。可能还有其他方法可以获得列表的内容。
但这看起来相当无意义。原因可能是由于对代码实际工作方式的误解。要找出代码为什么是这样编写的,最好的办法是去问编写它的人。在代码的注释中可能会有线索。你能透露更多关于你正在查看的代码的细节吗?
发布于 2009-01-30 17:10:31
也许他们正在尝试内存泄漏?使用new的默认实现,它将在堆上分配一个Widget,然后从它复制构造wag,然后它将立即泄漏新对象。
底线:不要模仿。我会用怀疑的眼光看待那个SDK。
编辑:如果这是在智能指针的上下文中完成的,那么他们肯定会保存指针以供以后删除。如果有一个XPtr模板可以做到这一点,你应该能够查看代码,看看它是不是在做这件事。SDK还应该在某个地方为您提供有关该构造的某种文档,因为它不是正常的,而且我也看不出它有什么好处。尽管如此,我仍然坚持我所说的:即使这不是一个保证泄漏,我仍然不会模仿它。
发布于 2009-01-30 17:06:50
这基本上是这样做的:
Widget wag = *(new Widget());
// or
Widget wag;
我不知道这是否会适当地释放它。我猜它不会。
回答你的问题,我觉得它的设计选择很糟糕。也许他们想要开始使用指针,但后来变得丑陋起来。
https://stackoverflow.com/questions/496305
复制相似问题