我有以下用于在 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)
:
对于 testArray.add(7)
:
注意当 5
被添加到内存地址 0x00dfec58
的 arr
时,它是如何被正确添加的。但是当 7
第二次添加到 arr 时,7
根本没有添加到 arr
。我想知道如何解决这个问题。
最佳答案
调试器不知道 arr
指向一个数组。它只是一个 int*
。 int
在它指向的地址处的值是您添加的第一个值,5,这就是它向您显示的内容。它不知道 actualSize
和 arr
之间的关系是什么。所以,7 就在那里,只是调试器没有显示它,因为它不知道你想要它。
检查 arr[1]
的值,您应该会看到 7。
关于c++ - 为什么 placement new 第一次正确创建/添加对象但第二次却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38678937/