【问题标题】:Vector constructor memory allocation for constant iterators, seg fault常量迭代器的向量构造函数内存分配,段错误
【发布时间】:2013-02-17 01:45:32
【问题描述】:

我在弄清楚如何为这个构造函数分配空间时遇到了麻烦。它应该在开始和结束之间用另一个 Vector 的元素构造一个 Vector。

template <class T> Vector<T>::Vector(const_iterator start, const_iterator finish)
{
    array = new T[2 * capacity()];

    for( ; start != finish; start++ ){
        push_back(*start);
    }
}

我一直在尝试调试它,但无法弄清楚。 push_back 看起来像这样:

template <class T> void Vector<T>::push_back(const T & val)
{
    if (size() == capacity()) {
        reserve (2 * capacity() + 1);
    }

    array[ theSize++ ] = val;
}

调用reserve..

template <class T> void Vector<T>::reserve(int newCapacity)
{
    if (newCapacity < size()) {
        return;
    }

    T * array_copy = array;

    array = new T [newCapacity];
    for (int i = 0; i < size(); i++) {
        array[i] = array_copy[i];
    }

    theCapacity = newCapacity;

    delete [] array_copy;
}

所以,缩小问题范围:

为什么会发生分段错误?

【问题讨论】:

  • 您是否使用 gdb、valgrind 或两者都调试过?
  • 另外,你用什么类型的T 实例化模板类,你从哪里得到你调用构造函数的迭代器?
  • 你没有在构造函数中初始化size()capacity()。构造函数中调用的push_back()可能会受到随机初始化值的影响。
  • 你初始化theSizetheCapacity了吗?它究竟是如何崩溃的?
  • @timrau 哇,我花了这么多时间试图弄清楚发生了什么,就这么简单,哈哈。谢谢

标签: c++ vector constructor implementation fault


【解决方案1】:

您没有在构造函数中初始化size()capacity()。构造函数中调用的push_back()可能会受到随机初始化值的影响。

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多