在c ++中是否有任何方法可以确保在编译时不会在任何地方使用非模板函数?

时间:2016-07-29 18:44:39

标签: c++ function compilation

所以我知道我可以在编译之后(通常使用反汇编和-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。

一般来说,我想确保我的程序不执行任何类型的动态内存分配。我希望在编译时确保这一点。

2 个答案:

答案 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模板。