1

いくつかの狂気のために、私は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を設定してこれらの「機能」をオフにする以外に(私が誤って失敗したかどうかを実際に知りたい)、実際の原因とこれを修正する方法について誰もが考えています。 ?そこには冗長なクリアがいくつかありますが、それがこの問題の原因になるとは思いません。特に、コードがそもそもデストラクタに到達することさえないことを考えると。

前もって感謝します!

〜ダン

4

2 に答える 2

2
ParentClass::ParentClass()
{
    this->~ParentClass();
}

デストラクタは通常の関数ではなく、特別な関数です。オブジェクトでデストラクタを呼び出すと、そのオブジェクトはすべてのベースとメンバーを含めて完全に破棄されます。ParentClassここでは、完全に構築される前にオブジェクトを破棄しています。オブジェクトを使用しようとすると、表示されるエラー メッセージでフラグが付けられたような問題が発生する可能性があります。

デストラクタと別の関数の間でコードを共有したい場合は、別の関数のコードをデストラクタと他の関数から呼び出す必要があります。ほとんどすべてのアプリケーション コードでは、デストラクタを明示的に呼び出す必要はありません。

std::vectorデフォルトでは空で構築され、破壊時にクリーンアップされるため、ChildClassコンストラクターとParentClassコンストラクターとデストラクターはすべて冗長であり、省略できます。

于 2012-04-12T06:39:00.583 に答える
1

ここに何の意図があるのか​​ わかりませんが、削除するthis->~ParentClass();と機能します。

于 2012-04-12T03:29:49.643 に答える