Tôi hiện đang nghiên cứu COM và mã sau nhầm lẫn với tôi.Làm thế nào một phương pháp thành viên có thể xóa đối tượng?
STDMETHODIMP _(ULONG) ComCar::Release()
{
if(--m_refCount==0)
delete this; // how could this "suicide" deletion be possible?
return m_refCount;
}
Tôi tự hỏi làm cách nào để xóa đối tượng đối tượng trong phương pháp thành viên? Vì vậy, tôi đã thực hiện thí nghiệm sau:
class A
{
public:
void Suicide(void);
void Echo(void);
char name;
};
void A::Echo(void)
{
::printf("echo = %c\n",name);
}
void A::Suicide(void)
{
delete this;
}
int main(void)
{
A a;
a.name='a';
a.Suicide(); //failed
}
Và việc thực hiện không thành công tại a.Suicide(). Gỡ lỗi báo cáo một số "Debug Assertion Failed". Ai đó có thể làm sáng tỏ tôi không? Nguyên nhân tôi hoàn toàn là một newbie trên COM.
Một chủ đề liên quan là ở đây: Question about COM Release() method
Và sửa chữa đơn giản chỉ trả về 0, tất nhiên. – GManNickG
Cảm ơn, Michael, kể từ khi bạn đề cập đến "alloacation động", tôi đoán nếu có một số "alloacation tĩnh" đối diện? nó là gì và sự khác biệt là gì? có thể khó giải thích nó trong một từ. Bạn có thể cho tôi một số tài liệu tham khảo để nghiên cứu sâu hơn không? cảm ơn nhiều. : D – smwikipedia
@GMan: Chỉ muốn làm rõ ý bạn là: 'if (--m_refCount == 0) {xóa cái này; trả về 0; } trả về m_refCount; '. Bạn không thể thay đổi câu lệnh return thành 'return 0;'. – Dan