我有一个向量的自定义分配器,但我宁愿在代码中没有它。所以我想把它投射到法线向量
vector<Complex> * createVector(size_t nfft)
{
vector<Complex,fftalloc<Complex > > * data = new vector<Complex,fftalloc<Complex > >(nfft);
return reinterpret_cast<vector<Complex> *>(data);
}
我的allocator / deallocator函数如果被调用则打印出来:
pointer allocate (size_type num, const void* = 0) {
// print message and allocate memory with global new
ALLOCDEBUG << "allocate " << num << " element(s)"
...
}
void deallocate (pointer p, size_type num) {
// print message and deallocate memory with global delete
ALLOCDEBUG << "deallocate " << num << " element(s)"
...
}
但是用
进行测试 {
vector<complex<double> > * v;
v = fft.createVector(16);
v->push_back(1);
delete v;
}
仅打印出分配函数。
是否可以在不丢失解除分配器的情况下进行投射?
答案 0 :(得分:2)
这里的问题是分配器是模板的属性,不是作为vector
或其他东西的一部分存储的。因此,当您从一种vector
转换为另一种类型时,您正在更改模板类型的allocator元素。
解决这个问题的最简单方法[在输入方面]是声明一个类型,例如: typedef vector<double, fft_alloc<double> > fftdouble;
- 使用模板声明可以帮助制作许多这样的类型。
您无法交换和更改您使用的分配器,并且[在当前标准中]没有简单的解决方案。
答案 1 :(得分:0)
将指向A的指针转换为指向B的指针,其中B与A不在同一继承层次结构中,然后使用指向B的指针除了返回指向A的指针以外的任何其他行为是未定义的行为。
一旦我们调用未定义的行为,所有讨论都必须结束,因为我们不再能够推断程序任何部分的行为。
vector<Complex,fftalloc<Complex > >
与vector<Complex> *>
的格式和形式不同。
我很想知道你在这里想要实现什么。第一个向量中的自定义分配器仅控制存储复数的内存分配。由于代码试图抛弃分配器,因此可以得出结论,你并不打算增加向量的长度。在这种情况下,问题是,因为分配只发生一次,为什么还要使用自定义分配器呢?