来自QMap.insert(QString,int)的分段错误

时间:2012-01-20 05:28:40

标签: c++ linux qt segmentation-fault

我从this线索中找到了信息,我开始怀疑那里提供的信息是否与我所面临的问题的原因有关。

QMap采用以下模板参数:

QMap< QString, int >

我的主要问题是我正在初始化一个立方体类,并且在该类中包含应该执行非常具体的事情的各种调用。

其中一个特别围绕设置“QMap成员”。

请注意以下事项:

mGeometry = new Geometry;
mGeometry->Init();

mCamera = QVector3D( 10.0, 10.0, 10.0 );

mCubeage.insert( "cubes", 0 );

mCubeage.insert( "cubes", 0 );

的调试输出

// ASCII兼容性

1)(呃哦)

#ifndef QT_NO_CAST_FROM_ASCII
    inline QT_ASCII_CAST_WARN_CONSTRUCTOR QString(const char *ch) : d(fromAscii_helper(ch))
    {}

2)

template <class Key, class T>
Q_INLINE_TEMPLATE typename QMap<Key, T>::iterator QMap<Key, T>::insert(const Key &akey,
                                                                       const T &avalue)
{
    detach(); //the called function

    QMapData::Node *update[QMapData::LastLevel + 1];
    QMapData::Node *node = mutableFindNode(update, akey);
    if (node == e) {
        node = node_create(d, update, akey, avalue);
    } else {
        concrete(node)->value = avalue;
    }
    return iterator(node);
}

第3)

bool operator==(const QMap<Key, T> &other) const;
    inline bool operator!=(const QMap<Key, T> &other) const { return !(*this == other); }

    inline int size() const { return d->size; }

    inline bool isEmpty() const { return d->size == 0; }

    inline void detach() { if (d->ref != 1) detach_helper(); } //the called function/if statement
    inline bool isDetached() const { return d->ref == 1; }
    inline void setSharable(bool sharable) { if (!sharable) detach(); d->sharable = sharable; }
    inline bool isSharedWith(const QMap<Key, T> &other) const { return d == other.d; }
    inline void setInsertInOrder(bool ordered) { d->insertInOrder = ordered; }

inline bool operator!=(int value) const
    {
        return _q_value != value;
    }

4)

inline bool operator!=(int value) const
    {
        return _q_value != value;
    }

而且......那就是它停止的地方 - BOOM,分段错误。根据一些Qt论坛 - 在互联网领域 - 宣称指向QMap的指针是不明智的,我最初认为这主要是因为发生这种情况的一个可能原因可能是由于QMap可能尚未正确初始化。然而,事实上,它是一个具有默认构造函数的类成员,我相信这与此相矛盾。

问题

根据以上所述,为什么会发生这种情况?可以做些什么呢?

思想

在有人提到我将const char*传递给QString参数的事实之前,我应该注意到我已经尝试声明一个QString并将其作为参数传递给我。我也应该注意到我是在Qt Creator中从Ubuntu 11.10运行的。

1 个答案:

答案 0 :(得分:2)

  

可以做些什么呢?

只有一件事:在valgrind下运行你的程序,并解决你找到的所有问题。

为什么会这样???谁知道?您没有提供足够的信息。也许堆栈粉碎,也许你覆盖了一些数组的结尾等等。