1

ACertificateInfoにはいくつかのCStrings and someCTimes` があります。

実行が CheckCertificates の右中括弧に達すると、ヒープの破損により実行が中断されます。最後のコール スタック フレームは CSWizard.exe!_CrtIsValidHeapPointer(const void * pUserData=0x00ba8e08)、割り当て解除からのものaCertificatesです。

    typedef vector<CertificateInfo> CertificateArray;

    CertificateArray CertificateStore::CollectCertificatesInfo(CertificateArray &ca, 
                                                               bool bExpirationDateOnly /* = false */,
                                                               bool bCertSignOnly /* = true */)
    {
        CertificateArray aCertificates;

         while(Precondition())
         {
             CertificateInfo ci;
             if(Condition(ci))
             {
                 aCertificates.push_back(ci);
             }
         }

         return aCertificates;
    }

    void CSWizardApp::CheckCertificates(bool bOnDemand)
    {
        PersonalStore store;
        CertificateArray aCertificates;

        aCertificates = store.CollectCertificatesInfo();
    }

私は何を間違っていますか?どうすれば修正できますか?

私が気づいたのは、 でCertificateInfo返された1 に対して、コンストラクターが 1 回呼び出され、フィールドCertificateArrayのデストラクタが3 回呼び出されることです。CertificateInfo

4

5 に答える 5

2

ca渡すパラメーターを非表示にするローカル変数を定義してcaいます。ここでの問題はこれだけではありませんが、上記のコードはほぼ間違いなく、期待どおりに動作しません。

編集:パラメーターからローカル変数を明確にしたので:

  • パラメータCollectCertificatesInfoが使用されていません - これは意図的なものですか?
  • 他の人がすでに指摘しているように、 のインスタンスはCertificateInfoここでたくさんコピーされており、そのコピー構造が壊れている可能性がありますが、そのクラスのコードを提供していないため、確実に言うことは不可能です.
于 2013-07-23T14:19:53.340 に答える
1

OK、注意が必要なことがいくつかあります。

関数のパラメーターとして宣言caし、ローカルで変数としても宣言します。これが意味することは、 を呼び出すとca.push_back(ci)、実際にはローカル バージョンに挿入しようとしているということです。

後で試して戻りcaます - これは値によって行います。これは通常は問題ありませんが、コンパイラは、その関数でローカル バージョンのコピーとして作成された( で追加された) 値を含むコピー (詳細については、こちらを参照) を実際には返さないことに注意してください。ca.push_back(ci)

についてもう少し知らなければ、これ以上言うのは難しいCertificateInfoです。pUserDataデストラクタでクリアされるポインタが含まれていますか? その場合、コピーを実行するときに、その変数が指すヒープ データをコピーするロジックがない場合は、関数が返され、のローカル バージョンciが破棄されます (関連付けられているデータpUserDataも取得する方法です)。デストラクタが書き込まれている場合)、返されたコピー内のポインタは無効になります。

これは役に立ちますか?

于 2013-07-23T14:36:01.857 に答える
0

あなたが投稿したコードはやや単純化されすぎています: CollectCertificatesInfo() に渡されたパラメーターはどれも使用れていません。

CSWizardApp::CheckCertificates()の本体にあるストア変数はCertificateStoreである必要があると思いますか、それともPersonalStoreがCertificateStoreのサブクラスであることを暗示しているのでしょうか?

あなたが何をしようとしているのかを理解するのは難しいので、さらに助けを求める前に、コードを少しきれいにするか、コードを完成させることをお勧めします。

于 2013-07-23T14:48:48.433 に答える
0

問題が解決しました。の代わりに、変数へのポインターを使用しました。これは、メモリがスタックではなくヒープに割り当てられることを意味します。したがって、実行が終了すると、関数に使用されるスタック上のメモリはクリアされますが、ヒープ上のオブジェクトに割り当てられたメモリは割り当て解除されません。これは理にかなっています :) . ばかげている私は以前にそれについて考えていませんでした。CertificateArrayCertificateStore::CollectCertificatesInfoCertificateArrayCertificateStore::CollectCertificatesInfoCertificateInfo

皆さん、助けてくれてありがとう:)

于 2013-07-25T12:58:19.070 に答える