[英]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 ,或者你是暗示PersonalStore是CertificateStore的子類?
我建議你在要求進一步幫助之前稍微清理你的代碼或完成它,因為很難弄清楚你想要做什么。
問題解決了。 我在CertificateStore::CollectCertificatesInfo
使用指向 CertificateArray
變量的指針而不僅僅是CertificateArray
。 這意味着內存分配在堆上 ,而不是堆棧上。 因此,當執行離開CertificateStore::CollectCertificatesInfo
,用於該函數的堆棧上的內存被清除,但是堆上的CertificateInfo
對象分配的內存未被釋放,這是有道理的:)。 這是愚蠢的我沒有考慮過它。
謝謝你的幫助,伙計:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.