未调用指针数组的 C++ 重载删除运算符
C++ overloaded delete operator for array of pointers not being called
没有调用删除运算符。任何方向都会有所帮助。我正在使用 Visual studio 2019。我确实查看了 link ,但无法解决我的问题。感谢您的帮助!
#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;
}
您没有为 operator new[](size_t sz)
提供重载,所以您很幸运,您的 operator new(size_t sz)
被调用了。
编译器正在调用未调整大小的版本 delete[]
,因此您需要提供 operator delete[](void *ptr) noexcept
函数。注意,the standard需要在替换带尺码的版本时更换非尺码版本。
没有调用删除运算符。任何方向都会有所帮助。我正在使用 Visual studio 2019。我确实查看了 link
#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;
}
您没有为 operator new[](size_t sz)
提供重载,所以您很幸运,您的 operator new(size_t sz)
被调用了。
编译器正在调用未调整大小的版本 delete[]
,因此您需要提供 operator delete[](void *ptr) noexcept
函数。注意,the standard需要在替换带尺码的版本时更换非尺码版本。