Поврежден стек при ссылке на специализированные шаблоны

Я просто пошел на какое-то странное поведение и какое-то время задавался вопросом, что происходит.

Я написал библиотеку C++, содержащую класс MemoryBlock:

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

MemoryBlock.h:

template <int Platform, typename T>
class MemoryBlock {
public:
    MemoryBlock(unsigned size);
    ~MemoryBlock();
};

и частичная специализация (которую я хочу скрыть от абонента)

MemoryBlock0.h:

template <typename T>
class MemoryBlock<0, T> {
private:
    T* _data;
    unsigned _size;

public:
    MemoryBlock(unsigned size): _size(size) {
        _data = (T*) malloc(size*sizeof(T));
    }

    ~MemoryBlock() {
        free(_data);
    }
};

в файле cpp, создать шаблоны для float и double

Instanciation.cpp

template MemoryBlock<0, double>;
template MemoryBlock<0, float>;

В отдельном проекте я ссылаюсь на (статическую) библиотеку, сгенерированную с помощью приведенного выше кода, и включает заголовок концепции

main.cpp

#include <MemoryBlock.h>

int main(int argc, char** argv) {
   MemoryBlock<0, float> a(100);
}

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

1 ответ

Решение

Некоторое время спустя я решил добавить два поля в файл "concept":

template <int Platform, typename T>
class MemoryBlock {
private:
    T* _data;        // must match the specialization apparently
    unsigned _size;  // must match the specialization apparently
public:
    MemoryBlock(unsigned size);
    ~MemoryBlock();
};

И ошибка теперь исправлена.

Похоже, что клиентский проект (тот, который ссылается на lib) не знает о представлении внутренней памяти частичной специализации и доверяет заголовку концепции, даже если все символы статически связаны.

Другие вопросы по тегам