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

stack corrupted when linking to specialized templates

本文关键字:堆栈 已损坏 专用 链接      更新时间:2023-10-16

我只是做了一些非常奇怪的行为,想知道发生了什么。

我写了一个C++库,其中包含一个类MemoryBlock:

所以我有两个头文件,一个用于"概念",另一个用于部分专门化。

内存块.h:

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

和部分专业化(我想对呼叫者隐藏)

内存块0.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文件中,一个实例化浮点和双的模板

Instacction.cpp

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

在一个单独的项目中,我链接到上面代码生成的(静态)lib,并包括概念头

Main.cpp

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

这可以很好地编译和链接。然而,在运行时,我得到了一个错误:变量"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的项目)似乎不知道部分专用化的内部内存表示,并且信任概念头,即使所有符号都已静态链接。