为什么第一次正确放置新建/添加对象但第二次没有?

时间:2016-07-30 22:10:55

标签: c++ arrays debugging arraylist

我有以下用于在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)

这是变量看起来像之前 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添加到内存地址arr的{​​{1}}时,它会被正确添加。但是当第二次将0x00dfec58添加到a​​rr时,7根本不会添加到7。我想知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

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

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