【问题标题】:C++ overloaded delete operator for array of pointers not being called未调用指针数组的 C++ 重载删除运算符
【发布时间】:2021-07-17 19:37:49
【问题描述】:

删除操作符没有被调用。任何方向都会有所帮助。我正在使用 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_t size) noexcept
{
   std::puts("global op delete called");
   std::printf("%d", 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;
}


【问题讨论】:

  • 您甚至可以为非用户定义的类型重载 new 和 delete 运算符吗?
  • @NathanPierson 你没有覆盖他们。您正在替换全局分配和解除分配功能。见new.delete
  • 整洁。出于某种原因,我认为您只能与成员操作员一起做。
  • 尝试覆盖 delete 而不使用 size 参数。
  • @Someprogrammerdude -- 使用printf 的原因是允许流插入器使用operator new 分配内存,并使用operator delete 释放它。如果发生这种情况,您将面临无限递归的风险。 printf 不了解 C++ 内存管理函数,因此可以安全地从 operator newoperator delete 调用。

标签: c++ visual-c++


【解决方案1】:

您没有为operator new[](size_t sz) 提供重载,所以您很幸运您的operator new(size_t sz) 被调用了。

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

【讨论】:

  • 看来operator new[]默认调用operator neweel.is/c++draft/new.delete#array-4
  • 感谢您的回复,我完全错过了 new[] 运算符。还实现了没有大小的 delete[] 运算符,它就像一个魅力。我真正的问题是尝试使用内存分配对旧应用程序进行故障排除。知道如何传递 size 参数,以便计算释放的内存。
猜你喜欢
  • 2014-12-24
  • 1970-01-01
  • 2016-11-02
  • 2021-07-02
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 2016-10-20
  • 2012-01-13
相关资源
最近更新 更多