আমি এর ::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 *, তাই বিনাশকারী ডাকা করতে পারবে না।