【发布时间】: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 new和operator delete调用。
标签: c++ visual-c++