微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Clang 10编译Visual Studio 2019时不会调用覆盖删除

如何解决使用Clang 10编译Visual Studio 2019时不会调用覆盖删除

我写了一些代码来使用重写的newdelete运算符跟踪内存:

#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 举报,一经查实,本站将立刻删除。