আমি এর ::delete
মধ্যে একটি ক্লাস করার জন্য কল করার চেষ্টা operator delete
করেছি। তবে ধ্বংসকারীকে ডাকা হয় না।
আমি এমন একটি ক্লাস সংজ্ঞায়িত করেছি MyClass
যার operator delete
ওভারলোড হয়েছে। বিশ্বব্যাপী operator delete
এছাড়াও ওভারলোড করা হয়। ওভারলোড operator delete
এর MyClass
ওভারলোড বিশ্বব্যাপী ডাকব operator delete
।
class MyClass
{
public:
MyClass() { printf("Constructing MyClass...\n"); }
virtual ~MyClass() { printf("Destroying MyClass...\n"); }
void* operator new(size_t size)
{
printf("Newing MyClass...\n");
void* p = ::new MyClass();
printf("End of newing MyClass...\n");
return p;
}
void operator delete(void* p)
{
printf("Deleting MyClass...\n");
::delete p; // Why is the destructor not called here?
printf("End of deleting MyClass...\n");
}
};
void* operator new(size_t size)
{
printf("Global newing...\n");
return malloc(size);
}
void operator delete(void* p)
{
printf("Global deleting...\n");
free(p);
}
int main(int argc, char** argv)
{
MyClass* myClass = new MyClass();
delete myClass;
return EXIT_SUCCESS;
}
আউটপুটটি হ'ল:
Newing MyClass...
Global newing...
Constructing MyClass...
End of newing MyClass...
Constructing MyClass...
Destroying MyClass...
Deleting MyClass...
Global deleting...
End of deleting MyClass...
আসল:
অতিরিক্ত লোড কল করার আগে ডেস্ট্রাক্টরের কাছে কেবল একটি কল operator delete
রয়েছে MyClass
।
প্রত্যাশিত:
ধ্বংসকারীকে দুটি কল রয়েছে calls ওভারলোড কল করার আগে এক operator delete
এর MyClass
। গ্লোবাল কল করার আগে আরও একটি operator delete
।
::delete p;
অপরিবর্তিত আচরণের কারণটি *p
ধরণের বস্তুর মুছে ফেলার
void*
অপারেন্ড এমনকি স্পষ্টতই খারাপভাবে তৈরি। [expr.delete] / 1 : " অপারেন্ডটি অবজেক্ট টাইপ বা ক্লাস টাইপের পয়েন্টার হতে পারে [[...] এর দ্বারা বোঝা যায় যে কোনও বস্তু টাইপ শূন্যের পয়েন্টার ব্যবহার করে মুছে ফেলা যায় না কারণ শূন্যস্থান কোনও বস্তুর প্রকার নয়। * "@OP আমি আমার উত্তরটি সংশোধন করেছি।
MyClass::operator new()
(কমপক্ষে)size
বাইটের কাঁচা মেমরি বরাদ্দ করা উচিত । এটির উদাহরণ সম্পূর্ণরূপে নির্মাণের চেষ্টা করা উচিত নয়MyClass
। এর কনস্ট্রাক্টরMyClass
পরে মৃত্যুদন্ড কার্যকর করা হয়MyClass::operator new()
। তারপরে,delete
অভিব্যক্তিটিmain()
ডেস্ট্রাক্টরকে কল করে এবং মেমরিটি প্রকাশ করে (আবার ডেস্ট্রাক্টরকে ফোন না করে)।::delete p
অভিব্যক্তি বস্তুর ধরণ সম্পর্কে কোন তথ্য আছেp
সাল থেকে এ পয়েন্টp
একটি হলvoid *
, তাই বিনাশকারী ডাকা করতে পারবে না।