我有以下用于在C ++中创建通用arraylist的简化代码:
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
添加到内存地址arr
的{{1}}时,它会被正确添加。但是当第二次将0x00dfec58
添加到arr时,7
根本不会添加到7
。我想知道如何解决这个问题。
答案 0 :(得分:1)
调试器不知道指向数组的arr
。它只是一个int*
。并且它所指向的地址int
的值是您添加的第一个,5,这就是它向您显示的内容。它不知道actualSize
和arr
之间的关系是什么。所以,7就在那里,只是调试器没有显示它,因为它不知道你想要它。
检查arr[1]
的值,您应该看到7。