C++ c++;释放定位器在施放后丢失?

C++ c++;释放定位器在施放后丢失?,c++,casting,allocation,C++,Casting,Allocation,我有一个用于向量的自定义分配器,但我不希望在所有代码中都有它。所以我想把它转换成法向量 vector<Complex> * createVector(size_t nfft) { vector<Complex,fftalloc<Complex > > * data = new vector<Complex,fftalloc<Complex > >(nfft); return reinterpret_cast<vec

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

vector<Complex> * createVector(size_t nfft)
{
    vector<Complex,fftalloc<Complex > > * data = new vector<Complex,fftalloc<Complex > >(nfft);
    return reinterpret_cast<vector<Complex> *>(data);
}
vector*createVector(大小\u t nfft)
{
矢量*数据=新矢量(nfft);
返回重新解释(数据);
}
如果调用my 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)"
       ...
   }
指针分配(大小\类型num,常量void*=0){
//打印消息并使用全局新文件分配内存

ALLOCDEBUG这里的问题是分配器是模板的一个属性,不是作为
向量的一部分存储的。因此,当您从一种
向量
转换为另一种类型时,您正在更改模板类型的分配器元素

[就类型而言]解决这个问题的最简单方法是声明一个类型,例如
typedef vector fftdouble;
-使用模板声明可以帮助创建许多这样的类型


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

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

[就类型而言]解决这个问题的最简单方法是声明一个类型,例如
typedef vector fftdouble;
-使用模板声明可以帮助创建许多这样的类型


您无法交换和更改所使用的分配器,而且[在当前标准中]也没有简单的解决方案。

将指向a的指针转换为指向B的指针,其中B与a不在同一继承层次结构中,然后将指向B的指针用于除返回指向a的指针之外的任何操作都是未定义的行为

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

vector
vector*>
的类型、形状或形式不同

在他们之间选角毫无意义


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

将指向a的指针转换为指向B的指针,其中B与a不在同一继承层次结构中,然后将指向B的指针用于除返回指向a的指针之外的任何操作都是未定义的行为

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

vector
vector*>
的类型、形状或形式不同

在他们之间选角毫无意义


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

不,
reinterpret\u cast
真是个坏主意。它甚至可能会使你的应用程序崩溃。具有不同分配器的向量是不兼容的类型,除非你我真的需要知道你在做什么(因为你显然不在这里)。为什么不使用fft\u vector=std::vector;
做一些像
template这样的事情呢?然后你只需要传递
fft\u vector
。这很明显,但我不喜欢使用或引入自定义类型。我曾经有一个应用程序在任何地方都使用自定义的CComplex。我必须重写它以使其可重用。“可以在不失去deallocator的情况下进行施放吗?”-不幸的是,绝对不可能(IMHO)理论上,如果您的编译器支持,您可以使用
std::experimental::pmr
中的
polymorphic_分配器
,以避免许多类型的浮动。我不记得它是否被编入了C++17,但如果它被编入了,我希望任何主要的编译器都已经支持它。不,
重新解释
真的是个坏主意。它可能被编入了C++17甚至会使你的应用程序崩溃。向量与不同的分配器是不兼容的类型,你不应该使用
重新解释\u cast
,除非你真的需要并且知道你在做什么(显然你在这里没有)。为什么不使用fft\u vector=std::vector;
做一些类似于
template的事情呢?然后你只需传递
fft\u vector
。这很明显,但我不喜欢使用或引入自定义类型。我曾经有一个应用程序在任何地方都使用自定义的CComplex。我必须重写它以使其可重用。”有可能在不失去deallocator的情况下进行施放吗?——不幸的是,绝对没有(IMHO)理论上,如果您的编译器支持,您可以使用
std::experimental::pmr
中的
polymorphic_分配器
,以避免出现许多类型的浮动。我不记得它是否被编入了C++17,但如果它被编入了,我希望任何主要的编译器都已经支持它。我认为分配器将与向量一起存储,但如果不是这样的话,它显然不起作用。我想分配器将与向量一起存储,但如果不是这样的话,它显然不起作用。
    {
        vector<complex<double> > * v;
        v = fft.createVector(16);
        v->push_back(1);
        delete v;
    }