演员后c ++ deallocator丢失了吗?

时间:2016-03-29 07:43:13

标签: c++ casting allocation

我有一个向量的自定义分配器,但我宁愿在代码中没有它。所以我想把它投射到法线向量

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

仅打印出分配函数。

是否可以在不丢失解除分配器的情况下进行投射?

2 个答案:

答案 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> *>的格式和形式不同。

在他们之间施展毫无意义。

我很想知道你在这里想要实现什么。第一个向量中的自定义分配器仅控制存储复数的内存分配。由于代码试图抛弃分配器,因此可以得出结论,你并不打算增加向量的长度。在这种情况下,问题是,因为分配只发生一次,为什么还要使用自定义分配器呢?