代码之家  ›  专栏  ›  技术社区  ›  Ak2399

部分释放C中的结构/类++

  •  -1
  • Ak2399  · 技术社区  · 1 年前

    有没有办法在C++中部分释放结构/类?我试图在C++中构建一个指向RefCount的新指针

    template<typename T>
    struct RefCount {
        unsigned int ref;
        T data;
    };
    
    template<typename T>
    class ptr {
        RefCount<T> *m_object;
    };
    

    无论何时都可以安全访问所指向的对象 ref > 0 并让用户能够 ref == 0 但不首先破坏RefCount的所有实例。

    我想过摧毁 data 部分(我称之为RefCount的“尾部”),但实际上保留 ref 内存中分配的部分 T 很大,我不想让它占据记忆中不重要的一部分。

    请注意,这个结构不是 表现 与std::sharedptr相同。

    • 在C++中部分释放结构/类的“尾部”是否有效?

    new和delete并没有提供一种方法,据我所知,有没有一种方法可以使用malloc()这样的函数来进行这种欺骗?希望在C++11之前完成此操作。

    我不想使用2指针方法的原因(指向 数据 裁判 作为2个不同的对象)是为了性能。而且我也不想因为明显的原因(它破坏了结构的工作方式)而重新分配一个单独保存bool的新对象。

    1 回复  |  直到 1 年前
        1
  •  4
  •   user17732522    1 年前

    C++内存分配API既没有提供这样的功能,也没有提供标准库Allocator接口,也没有 operator new / operator delete new / delete 表达式接口。

    C realloc ,可以与一起使用 malloc free ,在技术上允许这样做,但我认为标准库实现通常会忽略缩减分配的请求。但是,您不能使用 realloc 因为即使新的大小比旧的小,也不能保证不移动分配。

    当然,您可以编写自己的分配器来提供类似的东西。这种功能对分配器的性能和内存开销的影响是什么,这是另一个问题。我认为这通常不值得分配器受到性能惩罚。

    在任何情况下,该语言都不允许部分释放对象的存储,因此您不能 RefCount 结构相反,您需要将这两个子对象手动存储在分配的存储中,作为 std::byte unsigned char ,带有放置消息和显式析构函数调用,然后具有 m_object 指向此基础存储阵列,从中可以访问两个子对象 reinterpret_cast std::launder .