Поврежден стек при ссылке на специализированные шаблоны
Я просто пошел на какое-то странное поведение и какое-то время задавался вопросом, что происходит.
Я написал библиотеку 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) не знает о представлении внутренней памяти частичной специализации и доверяет заголовку концепции, даже если все символы статически связаны.