开始将一些库从 msvc 移动到 mingw,当人们想要删除一组向上转换的对象时,发现 msvc 的行为非常有趣。即 msvc 做了一些黑魔法(它似乎喜欢这样做),并且下面的代码执行得很好,但是在 mingw(4.7.2(崩溃。我相信 mingw 执行正确,它的 msvc voodoo 就是制作一个问题卧铺虫。
代码:
#include <iostream>
class foo{
static int idgen;
protected:
int id;
public:
foo(){
id = idgen++;
std::cout << "Hello ( foo - "<<id<<")"<<std::endl;
}
virtual ~foo(){
std::cout << "Bye bye ( foo - "<<id<<")"<<std::endl;
};
};
int foo::idgen = 0;
class bar: public foo{
double some_data[20];
public:
bar(){
std::cout << "Hello ( bar - "<<id<<")"<<std::endl;
}
~bar(){
std::cout << "Bye bye ( bar - "<<id<<")"<<std::endl;
}
};
int main()
{
const unsigned int size = 2;
foo** arr = new foo*[size];
{
bar* tmp = new bar[size];
for(int i=0; i<size; i++)
{
arr[i] = &(tmp[i]); //take address of each object
}
}
delete [] arr[0]; //take address of first object, pointer is same as tmp. This also crashes mingw
delete [] arr;
}
msvc 2010 的输出
Hello ( foo - 0)
Hello ( bar - 0)
Hello ( foo - 1)
Hello ( bar - 1)
Bye bye ( bar - 1)
Bye bye ( foo - 1)
Bye bye ( bar - 0)
Bye bye ( foo - 0)
还有 mingw (在毁灭中坠毁)
Hello ( foo - 0)
Hello ( bar - 0)
Hello ( foo - 1)
Hello ( bar - 1)
我的问题是,解决此问题的正确方法是什么。我想出的当前 hackfix 仅涉及尝试向下转换到每个可能的类并在向下转换的指针上调用删除操作:
if(dynamic_cast<bar*>(arr[0]) != 0)
delete [] dynamic_cast<bar*>(arr[0]);
除了重新设计库(它不是我的)之外,还有更好的方法吗?