小部件wag=*新小部件() 我刚刚遇到了一个C++ SDK,它大量使用了这个奇怪的代码>新的< /C>模式。我根本不明白他们为什么那样做

小部件wag=*新小部件() 我刚刚遇到了一个C++ SDK,它大量使用了这个奇怪的代码>新的< /C>模式。我根本不明白他们为什么那样做,c++,C++,使用*new构造对象有什么意义,例如Widget wag=*new Widget() 更新:有趣的是,他们实际上在做xptrp=*newt-必须是某些智能指针魔术的语义。还是没什么意义。我相信SDK是高质量的。这基本上做到了: Widget wag = *(new Widget()); // or Widget wag; 我不知道这是否能适当地释放它。我想不会的 回答你的问题,我觉得它的设计选择很糟糕。可能他们想开始使用指针,但后来变得很难看。也许他们在尝试内存泄漏?默认的new实现将在堆上

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


更新:有趣的是,他们实际上在做
xptrp=*newt-必须是某些智能指针魔术的语义。还是没什么意义。我相信SDK是高质量的。

这基本上做到了:

Widget wag = *(new Widget());

// or
Widget wag;
我不知道这是否能适当地释放它。我想不会的


回答你的问题,我觉得它的设计选择很糟糕。可能他们想开始使用指针,但后来变得很难看。

也许他们在尝试内存泄漏?默认的new实现将在堆上分配一个小部件,然后从中复制construct wag,然后它将立即泄漏新对象

底线:不要模仿。我会怀疑这一点


编辑:如果这是在智能指针的上下文中完成的,那么他们很可能正在保存指针以供以后删除。如果有一个XPtr模板正在这样做,您应该能够查看代码,看看它是否正在这样做。SDK还应该为您提供一些关于该构造的文档,因为这是不正常的,我并不认为它有什么好处。尽管如此,我还是坚持我所说的:即使这不是一个保证的泄漏,我也不会模仿它。

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

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


但这似乎毫无意义。原因可能是对代码实际工作原理的误解。要找出代码为什么是这样做的,最好的办法是询问编写代码的人。代码注释中可能有线索。您能透露更多关于您正在查看的代码的细节吗?

它不一定会泄漏。例如,考虑下面的

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;
模板
结构XPtr{
T*ptr;
XPtr(T&T):ptr&T{}
~XPtr(){delete ptr;}
};
...
xptrp=*新T;

或者更复杂的是,使用引用计数-以便可以复制p,XPtr跟踪其所有副本,等等。

引用计数对象的常见智能指针模式是,以下代码将存储对象并递增它:

SmartPtr<Type> ptr = new Type();
SmartPtr<Type> ptr = *new Type();
SmartPtr ptr=new Type();
下面的代码将存储该对象,而不是增加它:

SmartPtr<Type> ptr = new Type();
SmartPtr<Type> ptr = *new Type();
SmartPtr ptr=*新类型();
如果对象的构造函数应用第一个增量,则第二种形式很有用。否则,对象的ref计数将为2,并且当智能指针超出范围时,它仍然无法释放对象


不知道你正在使用的图书馆是否是这样。不过,快速阅读XPtr代码可能会告诉您。

他问他们为什么“这样做”。这个例子是来自SDK还是第三方教程?这个例子可能写得不好,也可能是复制构造函数设置了一个标志,这样堆栈分配的小部件就像引用计数的指针;我想我在模板支持普及之前也看到过类似的情况。有趣的是,你还可以覆盖给定类的new&delete,你可能会做一些非常疯狂的事情。但是你可以看到,对于我们大多数人来说,这真的是令人困惑和违反直觉的。但你有我的+1。