在任何类类型的模板方法中使用new

时间:2019-06-07 12:02:11

标签: c++ templates

我试图使“工厂”类型的单例在程序中生成组件。我想集中进行此操作,以便可以更好地控制程序中的内存分配。

我写了下面的代码,可以进行编译,但是使用它当然不能编译,因为编译器会尝试使用我输入的任何类来编写其版本,并且不包括该类。有没有办法使此代码在保持解耦和安全的同时工作?

template <typename T>
inline T*  generateComponent()
{
    return new T();
}

1 个答案:

答案 0 :(得分:0)

这不是您问题的直接答案,但是我认为您真正要搜索的是newdelete的重载。因此,您可以根据需要控制内存管理,并保持生产代码不变。

这是一个如何从cppreference.com形成

的示例
#include <cstdio>
#include <cstdlib>
#include <new>
// replacement of a minimal set of functions:
void* operator new(std::size_t sz) {
    std::printf("global op new called, size = %zu\n", sz);
    void *ptr = std::malloc(sz);
    if (ptr)
        return ptr;
    else
        throw std::bad_alloc{};
}
void operator delete(void* ptr) noexcept
{
    std::puts("global op delete called");
    std::free(ptr);
}
int main() {
     int* p1 = new int;
     delete p1;

     int* p2 = new int[10]; // guaranteed to call the replacement in C++11
     delete[] p2;
}

如果您使用new的隐式调用(例如,调整std::vector的大小。