อาการ
พิจารณาสถานการณ์สมมติต่อไปนี้:
-
คุณพัฒนาโปรแกรมประยุกต์โฮสต์การควบคุมที่เว็บเบราว์เซอร์หรือตัวควบคุม ActiveX
-
โปรแกรมประยุกต์หรือตัวควบคุม ActiveX อ้างอิงถึงวัตถุตัวแจงนับจากอินเทอร์เฟซสำหรับคอลเลกชันของเพจ HTML เมื่อต้องการสร้างฟังก์ชันนี้ ดูคำแนะนำต่อไปนี้:
-
ใน c ++, ตัวแจงนับได้รับ โดยการเรียกฟังก์ชันget__newEnumของอินเทอร์เฟซการเรียกเก็บเงิน ตัวอย่างของอินเทอร์เฟซแบบคอลเลกชันคือIHTMLElementCollectionและซึ่งโดยปกติจะได้รับ โดยการโทรหาIHTMLDocument2::get_all
-
ใน Visual Basic ขั้นตอนนี้จะดำเนินการเบื้องหลังในโครงสร้างแบบ foreach เหนือคอลเลกชัน (ตัวอย่างเช่น คอลเลกชัน document.all)
-
-
คุณเรียกใช้โปรแกรมประยุกต์บนคอมพิวเตอร์ที่มี 10 Internet Explorer ที่ติดตั้งอยู่
ในสถานการณ์สมมตินี้ การรั่วไหลของหน่วยความจำเกิดขึ้น
หมายเหตุ เนื่องจากตัวควบคุม ActiveX ที่ใช้หน่วยความจำเพิ่มเติมมากกว่าองค์ประกอบ HTML ท้องถิ่น หน่วยความจำรั่วจะชัดเจนยิ่งขึ้นถ้าองค์ประกอบในคอลเลกชันหนึ่งคือตัวควบคุม ActiveX
ตัวอย่างเช่น การรั่วไหลของหน่วยความจำเกิดขึ้นเมื่อคุณใช้รหัส c ++ต่อไปนี้ในฟังก์ชันของโปรแกรมประยุกต์โฮสต์การควบคุมที่เว็บเบราว์เซอร์ ในสถานการณ์นี้ ไดรฟ์ข้อมูลขนาดใหญ่ของหน่วยความจำคือหนึ่งถ้าองค์ประกอบบนเว็บเพจที่มีตัวควบคุม ActiveX
void CEnumLeakDlg::OnBnClicked(){
IDispatch* pDocDisp = m_web.get_Document();
IHTMLDocument2* pDoc = NULL;
HRESULT hr = pDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc);
IHTMLElementCollection* pElColl = NULL;
hr = pDoc->get_all(&pElColl);
IUnknown* pEnum = NULL;
hr = pElColl->get__newEnum(&pEnum);
pEnum->Release();
pElColl->Release();
pDoc->Release();
pDocDisp->Release();
}
การแก้ปัญหา
เมื่อต้องการแก้ไขปัญหานี้ ติดตั้งการปรับปรุงต่อไปนี้:
2862772 MS13-059: ปรับปรุงการรักษาความปลอดภัยสำหรับ Internet Explorer: 13 สิงหาคม 2013
ข้อมูลเพิ่มเติม
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับศัพท์เฉพาะในการปรับปรุงซอฟต์แวร์ ให้คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
824684คำอธิบายของคำศัพท์มาตรฐานที่ใช้เพื่ออธิบายปรับปรุงซอฟต์แวร์ของ Microsoft