หน่วยความจำไม่ถูกต้องเมื่อใช้คลาสจาก dll

นี่เป็นครั้งแรกที่ฉันพยายามส่งออกคลาสจาก dll สิ่งที่ฉันทำคือ: - สร้างอินเทอร์เฟซ (เฉพาะวิธีการเสมือนเท่านั้น) - ใช้อินเทอร์เฟซนี้ใน dll ด้วยคลาสที่จะไม่ถูกส่งออก - คลาสมีวิธีการปล่อยที่เรียกลบบนตัวชี้นี้ - สร้างคลาสโรงงาน ด้วยวิธีการคงที่ที่ส่งคืนตัวชี้ไปยังคลาสที่เป็นรูปธรรม แต่เป็นอินเทอร์เฟซ คลาสนี้ถูกส่งออก - การลบอ็อบเจ็กต์ที่ส่งคืนทำได้โดยการเรียกเมธอด release

ฉันรวบรวมทั้งหมดนี้จากบทช่วยสอนนี้เกี่ยวกับคลาสใน dll

ปัญหาคือเมื่อฉันใช้ dll นี้ในโครงการอื่น ทุกอย่างจะโอเคจนกว่าฉันจะเรียกใช้ฟังก์ชัน release บนออบเจ็กต์ จากนั้นจะแสดงหน้าต่างการยืนยันล้มเหลวพร้อมข้อความ "_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));"

สิ่งนี้เกิดขึ้นกับคนอื่นหรือไม่? ฉันรู้ว่ามันง่ายพอ ๆ กับการลืมใช้ std:: เมื่อคุณเริ่ม C++ แต่อย่างที่ฉันบอกว่าฉันเพิ่งเริ่มสิ่งนี้

ขอบคุณ!


person angela d    schedule 01.09.2011    source แหล่งที่มา
comment
คุณสามารถโพสต์อินเทอร์เฟซของคุณและส่งออกข้อมูลจำเพาะของโรงงานได้หรือไม่   -  person Andrew T Finnell    schedule 02.09.2011
comment
คุณกำลังคิดค้น COM ใหม่ ข้อความแสดงข้อผิดพลาดคือการวินิจฉัยมาตรฐานสำหรับความเสียหายของฮีป อะไรก็เป็นไปได้ ไม่มีเบาะแสที่แท้จริงที่จะช่วยเราช่วยคุณได้   -  person Hans Passant    schedule 02.09.2011


คำตอบ (2)


ฟังก์ชั่นโรงงานของคุณถูกกำหนดไว้ในส่วนหัวหรือไม่? หากเป็นเช่นนั้น และ new สำหรับการสร้างออบเจ็กต์อยู่ในส่วนหัว การเรียก delete จากภายใน DLL อาจทำให้เกิดข้อผิดพลาดนี้ได้ ฟังก์ชันโรงงานจำเป็นต้องส่งออกโดย DLL เฉพาะการประกาศเท่านั้นที่ต้องปรากฏในส่วนหัว

ตัวอย่างเช่น ส่วนหัวของคุณควรมีลักษณะดังนี้:

class MyInterface 
{
public:
  virtual void DoSomething() = 0;

  virtual ~MyInterface() {}
};

__declspec(dllexport) MyInterface * __stdcall MyInterfaceFactory();

การใช้งาน MyInterfaceFactory() จะต้องอยู่ภายใน DLL

person Praetorian    schedule 01.09.2011
comment
สำหรับข้อมูลพื้นฐานเพิ่มเติมว่าทำไมคุณจึงต้องทำเช่นนี้ โปรดดูที่ การจัดสรรและเพิ่มหน่วยความจำข้ามขอบเขตโมดูล - person Adam Rosenfield; 02.09.2011

ขอบคุณสำหรับคำตอบของคุณ และฉันขอโทษที่ฉันเริ่มต้นสิ่งนี้โดยเปล่าประโยชน์!

ปัญหานั้นง่ายมาก แต่ซ่อนอยู่หลังอินเทอร์เฟซ , โรงงาน และสิ่งอื่น ๆ ฉันกำลังส่งคืนตัวชี้ไปยังวัตถุที่ถูกประกาศว่าเป็นแบบคงที่เนื่องจากจะต้องเป็นซิงเกิลตัน จากนั้นฉันก็พยายามที่จะปล่อยวัตถุนี้ คอรัปชั่นเต็มกอง!!

ออบเจ็กต์ซิงเกิลของฉันไม่ควรมีฟังก์ชัน release ตั้งแต่แรก ฉันจะแก้ปัญหานี้ด้วยการแตกฟังก์ชัน release ในอินเทอร์เฟซแยกต่างหาก ซึ่งจะนำไปใช้โดยวัตถุที่ไม่คงที่เท่านั้น

person angela d    schedule 02.09.2011