0

DLLからエクスポートされた関数を使用しようとしたときに問題が発生しました。

次のようなメッセージが表示されます(申し訳ありませんが、画像をアップロードできませんでした)。

WindowsがLibTester.exeでブレークポイントをトリガーしました。

これは、ヒープの破損が原因である可能性があります。これは、LibTester.exeまたはロードされたDLLのいずれかにバグがあることを示しています。

これは、LibTester.exeにフォーカスがあるときにユーザーがF12キーを押したことが原因である可能性もあります。

出力ウィンドウには、より多くの診断情報が表示される場合があります。

オーバーロードされた代入演算子といくつかのコンストラクターを持つVectorクラスがあります。

Vector::Vector() : X(0.0f), Y(0.0f), Z(0.0f) { }
Vector::Vector(const Vector& vector) : X(vector.X), Y(vector.Y), Z(vector.Z) { }
Vector::Vector(float x, float y, float z) : X(x), Y(y), Z(z) { }
.
.
.
Vector& Vector::operator=(const Vector& rhs)
{
    this->X = rhs.X;
    this->Y = rhs.Y;
    this->Z = rhs.Z;

    return *this;
}

この問題は、コンストラクターによって生成された新しいベクトルに既存のベクトルを割り当てようとしている場合にのみ発生します。

Vector v1 = Vector();                  //Works
Vector v2 = Vector(1.0f, 1.0f, 1.0f);  //Works
v1 = v2;                               //Works
v1 = Vector();                         //Fails
v1 = Vector(1.0f, 1.0f, 1.0f);         //Fails

これに関連する場合、Vector構造体クラスIPrintableから派生します。

class IPrintable
{
public: 
    ~IPrintable() 
    {
        if (this->m_pStr != NULL)
            delete[] this->m_pStr;
    }

    virtual char* ToString() = 0;   

protected:
    char* m_pStr;
};

何がこの振る舞いを引き起こす可能性があるかについて誰かが手がかりを持っていますか?

4

1 に答える 1

2

IPrintableそれが問題の完全な定義である場合は、それm_pStrがユニット化されていることを意味し、 の誤った呼び出しが発生しdelete[]ます。

これは失敗します:

v1 = Vector();

一時Vectorが作成され、障害のあるデストラクタがすぐに実行されるためです。m_pStr初期化またはより良い解決策を修正するには、を使用することstd::stringです。a を使用する必要がある場合はchar*、コピー コンストラクターと代入演算子も実装するか、コピーを防止する必要があります ( What is The Rule of Three? を参照)。

于 2012-08-31T14:04:41.833 に答える