所以我知道我可以在编译之后(通常使用反汇编和-O0)或在运行时通过向其中引入异常来查看函数。
但是我有兴趣确保从未在任何地方调用特定函数(在本例中为operator new)?我想确保在编译时不执行任何动态内存分配。
警告可能足以使用该功能。
更新:
代码示例如下:
#include <functional>
#include <iostream>
// replace operator new and delete to log allocations
void* operator new (std::size_t n) {
std::cout << "Allocating " << n << " bytes" << std::endl;
return malloc(n);
}
void operator delete(void* p) throw() {
free(p);
}
class TestPlate
{
private:
int value;
public:
int getValue(){ return value; }
void setValue(int newValue) { value = newValue; }
int doStuff(const std::function<int()>& stuff) { return stuff(); }
};
int main()
{
TestPlate testor;
testor.setValue(15);
const std::function<int()>& func = std::bind(&TestPlate::getValue, &testor);
std::cout << testor.doStuff(func) << std::endl;
}
我希望每当有人试图使用operator new时都会收到错误。在这种情况下,std :: function的内部尝试使用operator new。
一般来说,我想确保我的程序不执行任何类型的动态内存分配。我希望在编译时确保这一点。
答案 0 :(得分:2)
如果您想100%确定永远不会调用某个函数,请将其删除。然后,如果确实有人试图调用它,编译器和链接器会对你大喊大叫。
答案 1 :(得分:1)
特定于类的运算符new如何将其设为私有?即:
class MyClass {
...
private:
void * operator new(size_t size);
};
然后在尝试调用new MyClass
时,编译器应该抱怨。
修改强>
所以另一种解决方案可能是使operator new
的调用不明确。例如:
// make the call to operator new ambiguous
struct Invalid {};
void * operator new(size_t size, Invalid inv = Invalid());
执行此操作后,operator new
的每次调用都将不明确(因为第二个参数具有默认值,因此编译器将不知道要使用哪个版本)。在您的示例中,它无法编译std::function
模板。