代码之家  ›  专栏  ›  技术社区  ›  Allamo Olsson

为什么我得到一个触发的断点?

  •  -1
  • Allamo Olsson  · 技术社区  · 6 年前

    我正试图创建自己的向量类,我认为我已经实现了所有正确的东西,但是我得到了这个错误,它说“main.exe触发了一个断点”。程序运行良好,直到超出范围,然后我的析构函数抛出这个异常,我认为我创建的容量容器有问题。

    template<typename A>
    inline void myVector<A>::capacityChange(int size)
    {
    if (size <= _capacity)
    {
        return;
    }
    A * newVector = new A[size]; // Skapar ett nytt vector för det nya capacitet
    
    //kopierar allt i det förra array till den nya
    for ( int i = 0; i < _capacity; i++)
    {
        newVector[i] = _data[i];
    }
    
    for (int i = 0; i < size; i++)
    {
        std::cout << i << ": " << newVector[i] << std::endl;
    }
    
    
    _capacity = size;
    
    delete[] _data;
    
    _data = newVector;
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Jeremy Friesner    6 年前

    我认为你的问题可能在这里:

    template<typename A>
    inline myVector<A>::myVector(const size_t &size, const A &value):   
               _size(size), _capacity(2 * size)
    {
       _data = new A[size]();
    

    在这个构造函数中,您已经设置了 _capacity 2*size ,但您只分配了 size 物体。这意味着以后,当你 main() 函数调用 push_back() 它会很高兴地写下你的 _data 数组最后重新分配到更大的 γ数据 数组;到那时您的堆已损坏,这就是为什么 delete 稍后调用崩溃(您在数组末尾的写入操作可能会覆盖一些堆的元数据,而这些元数据是堆正常工作所依赖的)