簡體   English   中英

如何避免在C ++中自動解除分配?

[英]How can I avoid automatic deallocate in C++?

CertificateInfo有一些CStrings and some CTimes`。

當執行到達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();
    }

我做錯了什么,我該如何解決?

我注意到的是,1 CertificateInfo在返回CertificateArray ,構造函數會被調用一次,而的析構函數CertificateInfo字段將被稱為3倍。

你要定義一個局部變量ca ,它可以隱藏參數ca您正在傳遞。雖然這這里是不是唯一的問題,上面的代碼幾乎可以肯定不會做你希望它做什么。

編輯:您現在已經從參數中消除了局部變量的歧義:

  • 沒有使用CollectCertificatesInfo的參數 - 這是故意的嗎?
  • 正如其他人已經指出的那樣, CertificateInfo實例在這里被復制很多,其復制結構可能會被破壞,但是由於你沒有給我們任何代碼,所以不可能肯定地說。

好的,有幾件事需要注意。

您將ca聲明為函數的參數,並在本地將其聲明為變量。 這意味着當你調用ca.push_back(ci) ,你實際上是在嘗試插入本地版本。

稍后你嘗試並返回ca - 你按價值做。 of the local version in that function. 這通常很好,但只要知道編譯器將不會真正返回一個副本(請參閱此處以獲取更多詳細信息),該副本將包含作為創建的值(添加了ca.push_back(ci) )。該功能的本地版本。

如果不了解更多關於CertificateInfo的信息,很難說更多。 它是否包含在析構函數中清除的指針pUserData that was returned will be invalid. 如果是這樣,當你執行復制時,如果你沒有一些邏輯來復制該變量指向的堆數據,那么當函數返回並且ci的本地版本被銷毀時(如果那是pUserData的數據也是如此)如何編寫析構函數)然后返回的中的指針將無效。

這有幫助嗎?

肯定有很多CertificateInfo的副本:

CertificateInfo ci; // 1st constructor
push_back(ci);      // 1st copy
return ca;          // 2nd copy

Condition(ci)可能是另一個副本 - 如何聲明Condition

確保CertificateInfo的副本ctr是正確的。

您發布的代碼有些過於簡單:沒有使用傳遞給CollectCertificatesInfo()的參數,唯一可能是ca ,但您在函數定義中重新聲明了它,從而阻止了對傳遞值的任何訪問。

我想CSWizardApp :: CheckCertificates()正文中的store變量應該是CertificateStore ,或者你是暗示PersonalStoreCertificateStore的子類?

我建議你在要求進一步幫助之前稍微清理你的代碼或完成它,因為很難弄清楚你想要做什么。

問題解決了。 我在CertificateStore::CollectCertificatesInfo使用指向 CertificateArray變量的指針而不僅僅是CertificateArray 這意味着內存分配在堆上 ,而不是堆棧上。 因此,當執行離開CertificateStore::CollectCertificatesInfo ,用於該函數的堆棧上的內存被清除,但是堆上的CertificateInfo對象分配的內存未被釋放,這是有道理的:)。 這是愚蠢的我沒有考慮過它。

謝謝你的幫助,伙計:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM