查找在给定指针类型上调用free的位置

Cho*_*ett 0 c++ visual-c++

我正在将类型从C风格的结构转换为C++风格的结构; 我加入的成员,这将迫使类型需要一个构造函数,因此,我必须切换mallocfreenewdelete.通过查找,我可以在任何地方找到分配类型(由于此代码库的约定)sizeof(TYPE).

有什么办法可以找到传递该类型指针的所有实例free吗?我认识到,由于参数freevoid*,这不是一个保证我发现到处类型被释放.

例如,我可以free以某种方式重载,以便在任何地方free(TYPE*)调用时都会出现编译错误,但在其他任何地方都没有?

Ste*_*sop 6

我可以以某种方式超载自由

你当然可以试一试.例如:

#include <cstdlib>
#include <iterator>

namespace my {
    class TYPE { };
    template <typename T>
    void free(T *ptr) { std::iterator_traits<T>::attempt_to_free_TYPE; }
}

using std::malloc;
using std::free;
using my::TYPE;

int main() {
    TYPE *ptr = (TYPE *) malloc(sizeof(TYPE));
    free(ptr);
}
Run Code Online (Sandbox Code Playgroud)

感谢ADL,该调用freemy::free,因此代码无法编译.显然这不会被捕获free((void*)ptr);,因为free除了参数之外的调用my::TYPE*不会受到影响.

正如我所写的那样,不需要对free内部命名空间my或具有的代码进行任何调用using namespace my;.因此,您可能希望使用新发明的命名空间.或者写一个不那么全面的模板,我即兴创作了一个.

它也没有捕获到完全合格的电话std::free.它是未定义的重载行为std::free(或命名空间std中的任何内容),但如果有必要,您可能只是为了查找调用站点而逃脱它.像这样的东西:

template <typename T>
struct allowed_to_free {
    enum { value };
};
template <>
struct allowed_to_free<TYPE> {};

namespace std {
    template <typename T>
    void free(T *ptr) {
        allowed_to_free<T>::value; 
        free((void*)ptr); 
    };
}
Run Code Online (Sandbox Code Playgroud)