c++ - 跟踪放置删除与放置新

标签 c++

我正在开发一种工具,例如内存泄漏检测器。我可以跟踪新的展示位置,但如何跟踪展示位置删除。我做了很多研发,发现placement delete不能直接调用,异常时由构造函数调用。那么我怎样才能跟踪放置删除与新放置的对比呢?

任何帮助将不胜感激......

最佳答案

您想配对分配和释放:

  • malloc/自由
  • 新建/删除(“常规”形式)
  • 新建[]/删除[]

但是您将什么与 placement new 配对? (明确地说:采用 void* 并且通常简称为“placement new”,而不是 new 的其他放置形式的那个。)它不是删除,而是一个显式的析构函数调用。

  • T *p = new(mem) T();/p->~T()

Placement new 实际上并没有分配任何东西,它只是调用构造函数的语法糖。您不需要也不应该跟踪它。它甚至比其他形式更奇怪,因为通常首先调用“销毁”位,然后用另一个对象替换被销毁的对象(与其他对象的顺序相反):

{
  T some_object;

  some_object->~T(); // die! die! die!
  new(&some_object) T();  // didn't save the return value? memory leak..? nope.
} // some_object leaves scope and is destructed (again)

关于c++ - 跟踪放置删除与放置新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4030575/

相关文章:

c++ - SFINAE 和定义顺序

c++ - 使用 gcc 4.8.4/clang3.4 编译 Nana 示例 (nana v1.1.2/1.1.3) 时出错

c++ - QNetworkRequest 和 QUrl 编码 c++

c++ - 如何安全地迭代互锁的列表?

c++ - scanf 没有按预期工作

c++ - pthread 堆栈变量内存泄漏

c++ - 关于 "stdio.h"和 <cstdio> 混合的编译器警告

c++ - OpenGL 中一致的手绘线

c++ - 在同一编译器(vc12)上编译时,是什么导致了重整名称的差异?

c++ - 将 ifstream 复制到 istream C++14