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

标签 c++ arrays debugging arraylist

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

相关文章:

arrays - 我似乎无法正确取消引用数组

C : Convert Char To Float Produce 0. 000002?

ios - 在 swift 中使用新的 Podfile 时如何忽略警告?

javascript - 使用脚本更改元素的尺寸

c++ - msbuild - 标记 propertygroup 具有属性 Label 但未记录

c++ - 从 Node JS 访问用 C++ 编写的设备 SDK

c++ - 没有 Boost 的 BOOST_DEDUCED_TYPENAME 的实现

c++ - Android NDK 中的未知类型名称错误

python - 将文本文件转换为数组

javascript - 如何检查数据是否被推送到 JSON 中