链接到专用模板时堆栈损坏
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,即使所有的符号都已经静态链接。
我刚刚遇到了一些非常奇怪的行为,想知道发生了什么。
我写了一个 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,即使所有的符号都已经静态链接。