c++ 释放器在投射后丢失了吗?

c++ deallocator lost after cast?

我有一个向量的自定义分配器,但我不想在代码中到处都使用它。所以我想把它转换成一个法向量

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

仅打印出分配函数。

是否可以在不丢失释放器的情况下进行转换?

这里的问题是分配器是模板的 属性,而不是作为 vector 或其他东西的一部分存储。因此,当您从一种类型的 vector 转换为另一种类型时,您正在更改模板类型的分配器元素。

[在类型方面]解决这个问题的最简单方法是声明一个类型,例如typedef vector<double, fft_alloc<double> > fftdouble; - 使用模板声明有助于创建许多此类类型。

您不能交换和更改您使用的分配器,[在当前标准中]没有简单的解决方案。

将指向 A 的指针强制转换为指向 B 的指针,其中 B 与 A 不在同一继承层次结构中,然后将指向 B 的指针用于除强制转换回指向 A 的指针之外的任何其他用途是未定义的行为。

一旦我们调用未定义的行为,所有讨论都必须结束,因为我们不再能够推理程序任何部分的行为。

vector<Complex,fftalloc<Complex > > 在任何方面、形状或形式上都与 vector<Complex> *> 不同。

它们之间的转换毫无意义。

我很想了解您在这里真正想要实现的目标。第一个向量中的自定义分配器仅控制存储复数的内存分配。由于代码试图摆脱分配器的视线,因此可以得出结论,您不打算继续增加向量的长度。在这种情况下,问题就来了,既然分配只发生一次,为什么还要用自定义分配器呢?