我正在将类型从C风格的结构转换为C++风格的结构; 我加入的成员,这将迫使类型需要一个构造函数,因此,我必须切换malloc和free到new和delete.通过查找,我可以在任何地方找到分配类型(由于此代码库的约定)sizeof(TYPE).
有什么办法可以找到传递该类型指针的所有实例free吗?我认识到,由于参数free是void*,这不是一个保证我发现到处类型被释放.
例如,我可以free以某种方式重载,以便在任何地方free(TYPE*)调用时都会出现编译错误,但在其他任何地方都没有?
我可以以某种方式超载自由
你当然可以试一试.例如:
#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,该调用free是my::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)