Использование метода new в шаблоне для любого типа класса - PullRequest
2 голосов
/ 07 июня 2019

Я пытался создать синглтон "фабричного" типа для генерации компонентов в моей программе. Я хотел сделать это централизованно, чтобы лучше контролировать выделение памяти в моей программе.

Я написал следующий код, который компилируется, но его использование, конечно, приводит к тому, что он не компилируется, потому что компилятор пытается написать его версию с любым классом, в который я вписал, а класс не включен. Есть ли способ заставить этот код работать, оставаясь отсоединенным и безопасным?

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

1 Ответ

0 голосов
/ 07 июня 2019

Это не прямой ответ на вашу проблему, но я думаю, что вы действительно ищете перегрузку для new и delete. Таким образом, вы можете контролировать управление памятью так, как вам нравится, и сохранять производственный код таким, какой он есть.

Вот пример, как это сделать: 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...