我终于开始尝试新的放置方式以创建有效的动态数组。目的是了解其工作原理,而不是替换类向量。构造函数起作用。分配了一个块但未初始化。添加每个元素后,将对其进行初始化。但是我看不到如何使用放置删除仅在存在的那些元素上调用析构函数。谁能解释一个?这段代码用于随着数组的增长一一分配元素,但是删除不正确。
template<typename T>
class DynArray {
private:
uint32_t capacity;
uint32_t size;
T* data;
void* operator new(size_t sz, T* place) {
return place;
}
void operator delete(void* p, DynArray* place) {
}
public:
DynArray(uint32_t capacity) :
capacity(capacity), size(0), data((T*)new char[capacity*sizeof(T)]) {}
void add(const T& v) {
new(data+size++) T(v);
}
~DynArray() {
for (int i = 0; i < size; i++)
delete (this) &data[i];
delete [] (char*)data;
}
};
实际上,您发现了唯一要手动调用析构函数的情况(至少我知道):
~DynArray() {
for (int i = 0; i < size; i++)
data[i].~T();
delete [] (char*)data;
}
与简单的类和结合使用main
,您应该获得预期的结果:
struct S {
~S() { std::cout << __PRETTY_FUNCTION__ << '\n'; }
};
int main() {
DynArray<S> da{10};
da.add(S{});
return 0;
}
请注意,您会看到析构函数调用了两次,因为DynArray
它通过const
引用来获取对象,因此它具有临时性。
$./a.out
S::~S()
S::~S()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句