如何解决使用Clang 10编译Visual Studio 2019时不会调用覆盖删除
我写了一些代码来使用重写的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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。