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