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

问题描述 投票:0回答: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::shared_ptr 不同。

  • 在 C++ 中部分释放结构/类的“尾部”是否有效?
据我所知,new 和 delete 没有提供这种方法,有没有办法使用像 malloc() 这样的函数来完成这种欺骗?希望在 C++11 之前能做到这一点。

我不想使用 2 指针方法(指向

data

ref
 作为 2 个不同的对象)的原因是为了性能。而且我也不想出于明显的原因重新分配一个单独保存 bool 的新对象(它破坏了结构的工作方式)。

c++ c++11 memory dynamic-memory-allocation heap
1个回答
0
投票
C++ 或 C 内存分配 API 均未提供此类功能。

您当然可以编写自己的分配器来提供类似的东西。这种功能对分配器的性能和内存开销影响是什么,是另一个问题。

但是,该语言不允许部分释放对象的存储,因此您不能拥有

RefCount

 结构。相反,您需要手动将两个子对象存储在分配的存储中,并对每个子对象进行放置新和显式析构函数调用,然后让 
m_object
 指向底层 
std::byte
unsigend char
 存储,您可以从中访问这两个子对象带有 
std::launder
.
的子对象

© www.soinside.com 2019 - 2024. All rights reserved.