いくつかの狂気のために、私はWin7Proの新規インストールでMicrosoftVisual Studio2010Ultimateにアップグレードすることを余儀なくされました。私はコードを構造の骨組みと一般的に何が起こっているのかまで減らしました。これは、VS2010のSTL実装のバグである可能性があると聞いています。その場合は、回避策を探しています。(編集:私の元のコードはVisual Studio 2008で正常に機能しました。)
ヘッダーファイルは次のとおりです。
#include <iostream>
#include <vector>
using namespace std;
class ChildClass //partition function for each
{
public:
ChildClass();
void Clear(void);
vector<double> childrenvars;
void PrintChildren(void);
//long list of other variables
};
class ParentClass
{
public:
ChildClass variable;
//other variables
ParentClass();
~ParentClass();
};
そして、ここにソースファイルがあります:
#include "source.h"
ChildClass::ChildClass()
{
Clear();
}
void ChildClass::Clear(void)
{
childrenvars.clear();
return;
}
void ChildClass::PrintChildren(void)
{
cout << endl;
for(unsigned int i=0; i<childrenvars.size(); i++)
cout << childrenvars[i] << " ";
}
ParentClass::ParentClass()
{
this->~ParentClass();
}
ParentClass::~ParentClass()
{
this->variable.childrenvars.clear();
}
int main(void)
{
ParentClass* ParVar = new ParentClass[5];
for(unsigned int numiter = 0; numiter < 3; numiter++)
{
for(unsigned int i=0; i<5; i++)
{
for(unsigned int j=0; j<i; j++)
ParVar[i].variable.childrenvars.push_back(j);
ParVar[i].variable.PrintChildren();
}
for(unsigned int i=0; i<5; i++)
ParVar[i].variable.Clear();
}
delete [] ParVar;
int wait;
std::cin >> wait;
return(0);
}
リリースでコンパイルすると、予測可能で機能的なものになります。
(blank)
0
0 1
0 1 2
0 1 2 3
0
0 1
0 1 2
0 1 2 3
0
0 1
0 1 2
0 1 2 3
デバッグモードでコンパイルすると、次のようになります。
(blank)
0
0 1
0 1 2
0 1 2 3
Debug Assertion Failed... vector iterators incompatible.
.Clear()関数を初めて呼び出すときに失敗します。これは、clear forループを1、2などで開始するように変更した場合でも発生します。.clear()が.erase(begin()、end())を呼び出すと、エラーが発生するようです。ベクトルに何も入れられておらず、すでに空になっている場合、それは本当に嫌いです。興味深いことに、消去でクリアループが2から始まるときにautosの下に表示されるものは次のとおりです(const_iterator _First_arg、const_iterator_Last_arg)。
予想どおり、_First_arg=0。
_Last_arg = -2.53 ... e-098
これ:
サイズ:2
容量:2
0:0.0000..。
1:1.000...。
最初のベクトルは0x002648e8で始まります最後のベクトルは0x002648f8で始まります(end()のためだと思いますが、これは実際には最後のベクトルを超えたものであり、8バイトのdoubleで意味があります)。
プリプロセッサの定義に移動し、_ITERATOR_DEBUG_LEVEL = 0を設定してこれらの「機能」をオフにする以外に(私が誤って失敗したかどうかを実際に知りたい)、実際の原因とこれを修正する方法について誰もが考えています。 ?そこには冗長なクリアがいくつかありますが、それがこの問題の原因になるとは思いません。特に、コードがそもそもデストラクタに到達することさえないことを考えると。
前もって感謝します!
〜ダン