Widget wag = * new Widget()

时间:2009-01-30 17:02:14

标签: c++

我刚刚遇到了一个C ++ SDK,它大量使用了这个非常奇怪的*new模式。我不明白为什么他们这样做。

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

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

5 个答案:

答案 0 :(得分:4)

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

底线:不要模仿。而且我会怀疑SDK。

编辑:如果这是在智能指针的上下文中完成的,那么它们当然可以保存指针以便以后删除。如果有一个XPtr模板正在执行此操作,您应该能够查看代码并查看它是否正在执行此操作。 SDK还应该为您提供某种关于该构造的文档,因为它不正常,我并没有真正看到它的优点。尽管如此,我仍然支持我说的话:即使这不是保证泄漏,我仍然不会模仿它。

答案 1 :(得分:4)

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

但是,必然内存泄漏。可能是Widget维护其所有实例的列表,并在其构造函数和析构函数中更新该列表。可能还有其他方法可以获得列表的内容。

但这似乎毫无意义。原因可能是由于对代码真正起作用的误解。找出代码编制方式的最佳方法是询问编写代码的人。代码的评论中可能有线索。你能透露更多关于你正在寻找的代码的细节吗?

答案 2 :(得分:3)

这基本上是这样的:

Widget wag = *(new Widget());

// or
Widget wag;

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

为了回答你的问题,我觉得它的设计选择很差。可能他们想开始使用指针,但后来变得丑陋。

答案 3 :(得分:2)

用于引用计数的对象的通用智能指针模式是以​​下代码将存储对象并IncRef它:

SmartPtr<Type> ptr = new Type();

以下代码将存储对象, IncRef it:

SmartPtr<Type> ptr = *new Type();

如果对象的构造函数应用第一个IncRef,则第二个表单很有用。否则,您的对象的引用计数为2,当智能指针超出范围时,它仍然不会释放该对象。

不知道您正在使用的库中是否存在这种情况。但是,快速阅读XPtr代码可能会告诉你。

答案 4 :(得分:1)

不一定是漏水。例如,请考虑以下

int &a = *new int();
delete &a;

它正在分配参考。它将保留所创建对象的身份(不创建副本),因此它不会丢失它,并且之后将删除它。将其置于代码的形式中,该类可以定义为

template<typename T>
struct XPtr {
    T *ptr;
    XPtr(T &t):ptr(&t) { }
    ~XPtr() { delete ptr; }
};

...
XPtr<T> p = *new T;

甚至更复杂,使用引用计数 - 以便可以复制p,并且XPtr会跟踪其所有副本,等等。