gpt4 book ai didi

c++ - 为什么 placement new 第一次正确创建/添加对象但第二次却没有?

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

我有以下用于在 C++ 中创建通用数组列表的简化代码:

template <typename T>
class ArrayList
{
public:
ArrayList(int size = 100);
void add(T item);
private:
T* arr;
size_t allocatedSize;
size_t actualSize;
};

template <typename T>
ArrayList<T>::ArrayList(int size)
:arr(static_cast<T*>(::operator new(sizeof(T)*size)))
, actualSize(0)
, allocatedSize(size)
{

}

template <typename T>
void ArrayList<T>::add(T item)
{
if (actualSize >= allocatedSize)
resize();

new(arr + actualSize) T(std::move(item));
actualSize++;
}

我有以下测试代码:

int main()
{
ArrayList<int> testArray = ArrayList<int>();

testArray.add(5);
testArray.add(7);
}

问题是 5 正确地添加到 arr 中,但 7 没有。以下是调试器在每种情况下的样子。

对于 testArray.add(5):

这是变量在 5 添加到 arr 之前的样子 Before 5 is added

这是将 5 添加到 arr 之后 变量的样子 After 5 is added

对于 testArray.add(7):

这是变量在 7 添加到 arr 之前的样子 Before 7 is added

这是将 7 添加到 arr 之后 变量的样子 After 7 is added

注意当 5 被添加到内存地址 0x00dfec58arr 时,它是如何被正确添加的。但是当 7 第二次添加到 arr 时,7 根本没有添加到 arr 。我想知道如何解决这个问题。

最佳答案

调试器不知道 arr 指向一个数组。它只是一个 int*int 在它指向的地址处的值是您添加的第一个值,5,这就是它向您显示的内容。它不知道 actualSizearr 之间的关系是什么。所以,7 就在那里,只是调试器没有显示它,因为它不知道你想要它。

检查 arr[1] 的值,您应该会看到 7。

关于c++ - 为什么 placement new 第一次正确创建/添加对象但第二次却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38678937/

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