链接到专用模板时堆栈损坏

stack corrupted when linking to specialized templates

我刚刚遇到了一些非常奇怪的行为,想知道发生了什么。

我写了一个 C++ 库,包含一个 class MemoryBlock:

所以我有两个头文件,一个用于 "concept",一个用于偏特化。

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>;

在一个单独的项目中,我link到上面代码生成的(静态)库,并包含概念头

Main.cpp

#include <MemoryBlock.h>

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

这可以编译并且 link 非常好。 但是,当 运行 时,我得到一个错误:变量 "a"

周围的堆栈已损坏

搜索了一段时间后,我决定在 "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 的那个)似乎不知道偏特化的内部内存表示,并且信任这个概念 header,即使所有的符号都已经静态链接。