gpt4 book ai didi

c++ - 处理未初始化的数组

转载 作者:行者123 更新时间:2023-11-30 05:34:30 25 4
gpt4 key购买 nike

作为一个更大项目的一部分,我决定在 C++ c 数组包装器上工作,显然这可能只是一个 std vector ,但我在这方面学到了很多东西,它提出了一些我想喜欢进一步探索。

code review 上发布我的代码之后我增加了代码的复杂性。这主要改进了代码,但在此过程中我也遇到了一些新问题:

现在代码使用重载 new 来避免必须默认初始化成员。

Simple_Array(size_type size) :
_size(size),
_data(static_cast<pointer>(::operator new(_size * sizeof(value_type))))
{}

template <
class It,
class = typename std::enable_if< std::is_constructible< value_type,
typename std::iterator_traits<It>::value_type >::value >::type
>
Simple_Array(It first, It last) :
Simple_Array(std::distance(first, last))
{
for (iterator i = _data; first != last; ++first, ++i)
new (i) value_type{*first};
}

因此必须为每个成员调用析构函数:

~Simple_Array() {
for (iterator i = begin(); i != end(); ++i)
i->~value_type();

::operator delete(_data);
}

如果您尝试创建一个 Simple_Array<Simple_Array<int>> 可以很好地说明这里的问题。 ,在销毁此类类型期间,如果任何成员未初始化,则当未初始化的 Simple_Array 调用其析构函数时,它将开始使用未初始化的迭代器并导致各种问题。 (注意,begin() 只返回 _data,end() 返回 _data + _size。迭代器是一个 Ty*,_data 是一个 Ty*(c 数组),_size 是一个 std::size_t。)

我的问题是如何处理这种销毁未初始化成员的情况?我是否最好接受成员需要默认构造函数?

最佳答案

不,您不需要要求对象是默认可构造的。

您必须做的是将内存分配和对象初始化的关注点分开。

这是就地构造函数和析构函数的少数合法用途之一。

不要忘记干净地处理析构函数!!

构造函数应该是这样的:

SimpleArray(Iter first, Iter last)
: _size(last - first)
, _data(allocate_aligned_uninitialised_memory()) // <- you need to figure this one out
{
// now we have allocated memory by no copied objects...
auto dest = &_data[0];
try {
while (first != last) {
// in-place construction
new (dest)(*first++);
++dest;
}
}
catch(...) {
// if one of the constructors threw, we must unwind the ones that didnt
while (dest != first) {
// in-place destruction
--dest;
dest->~dest();
}
// release the aligned memory
release_aligned_memory(_data);

// pass the exception on - we failed to construct
throw;
}
}

关于c++ - 处理未初始化的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34227204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com