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> *>
不同。
它们之间的转换毫无意义。
我很想了解您在这里真正想要实现的目标。第一个向量中的自定义分配器仅控制存储复数的内存分配。由于代码试图摆脱分配器的视线,因此可以得出结论,您不打算继续增加向量的长度。在这种情况下,问题就来了,既然分配只发生一次,为什么还要用自定义分配器呢?
我有一个向量的自定义分配器,但我不想在代码中到处都使用它。所以我想把它转换成一个法向量
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> *>
不同。
它们之间的转换毫无意义。
我很想了解您在这里真正想要实现的目标。第一个向量中的自定义分配器仅控制存储复数的内存分配。由于代码试图摆脱分配器的视线,因此可以得出结论,您不打算继续增加向量的长度。在这种情况下,问题就来了,既然分配只发生一次,为什么还要用自定义分配器呢?