微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

未调用指针数组的 C++ 重载删除运算符

如何解决未调用指针数组的 C++ 重载删除运算符

调用删除运算符。任何方向都会有所帮助。我使用的是 Visual Studio 2019。我确实查看了链接 overload delete[] for array of pointers,但无法解决我的问题。感谢您的帮助!

#include <cstdio>
#include <cstdlib>
#include <new>
// replacement of a minimal set of functions:
void* operator new(std::size_t sz) // no inline,required by [replacement.functions]/3
{
   std::printf("global op new called,size = %zu\n",sz);
   if (sz == 0)
      ++sz; // avoid std::malloc(0) which may return nullptr on success

   if (void* ptr = std::malloc(sz))
      return ptr;

   throw std::bad_alloc{}; // required by [new.delete.single]/3
}
void operator delete(void* ptr,size_t size) noexcept
{
   std::puts("global op delete called");
   std::printf("%d",size);
   std::free(ptr);
}
void operator delete[](void* ptr,size);
   std::free(ptr);
}
int main()
{
   unsigned char* p3 = new unsigned char[100]; 
   delete[] p3; // I was expecting this would call the overloaded delete operator
   return 0;
}


解决方法

您没有为 operator new[](size_t sz) 提供重载,因此您很幸运,您的 operator new(size_t sz) 根本没有被调用。

编译器正在调用未调整大小的版本 delete[],因此您需要提供 operator delete[](void *ptr) noexcept 函数。请注意,the standard 在替换需要大小的版本时需要替换非大小版本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。