问题描述
我写了一些代码来使用重写的new
和delete
运算符跟踪内存:
#include <iostream>
#include <mutex>
std::mutex mtx;
auto operator new(size_t size) -> void* {
{
std::lock_guard<std::mutex> lock(mtx);
// std::cout << "Allocating " << size << " bytes\n";
printf("Allocating %zu bytes\n",size);
}
return malloc(size);
}
auto operator delete(void* p,size_t size) -> void {
{
std::lock_guard<std::mutex> lock(mtx);
// std::cout << "Freeing " << size << " bytes\n";
printf("Freeing %zu bytes\n",size);
}
free(p);
}
class Object {
public:
Object() = default;
~Object() = default;
private:
int a_;
int b_;
};
auto main(int argc,char** argv) -> int {
{
auto* object = new Object();
delete object;
}
return 0;
}
如果我使用Visual Studio Build Tools 2019 Release - amd64
进行编译,则一切正常,并显示:
Allocating 8 bytes
Freeing 8 bytes
但是当我使用Clang 10.0.0 for MSVC with Visual Studio Build Tools 2019 Release (amd64)
进行编译时,则不会调用delete
:
Allocating 8 bytes
为什么clang
有这种行为?
解决方法
这是任何人需要的答案。
正如@Eljay在comment中所说的那样,您需要覆盖delete
运算符的两个版本
auto operator delete(void* p,size_t size) -> void {
{
std::lock_guard<std::mutex> lock(mtx);
// std::cout << "Freeing " << size << " bytes\n";
printf("Freeing %zu bytes\n",size);
}
free(p);
}
auto operator delete(void* p) -> void {
{
std::lock_guard<std::mutex> lock(mtx);
// std::cout << "Freeing " << size << " bytes\n";
printf("Freeing unknow bytes\n");
}
free(p);
}