代码之家  ›  专栏  ›  技术社区  ›  Dustin Getz sunsations

Widget wag=*新Widget()

c++
  •  3
  • Dustin Getz sunsations  · 技术社区  · 16 年前

    *new

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

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

    5 回复  |  直到 16 年前
        1
  •  4
  •   Rob Kennedy    16 年前

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

    没有 必要地 但内存泄漏。可能是这样 Widget

        2
  •  4
  •   Joel    16 年前

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

    底线:不要模仿。我会怀疑这个SDK。

    编辑:

        3
  •  3
  •   Daniel A. White    16 年前

    这基本上是这样做的:

    Widget wag = *(new Widget());
    
    // or
    Widget wag;
    

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

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

        4
  •  2
  •   fastcall    16 年前

    SmartPtr<Type> ptr = new Type();
    

    以下代码将存储对象和 添加:

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

    如果对象的构造函数应用了第一个IncRef,则第二种形式很有用。否则,你的对象的引用计数将为2,当智能指针超出作用域时,它仍然不会释放对象。

    不知道你正在使用的图书馆是否是这种情况。不过,快速浏览一下XPtr代码可能会告诉你。

        5
  •  1
  •   Johannes Schaub - litb    16 年前

    它不一定会泄漏。例如,考虑以下内容

    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;