gpt4 book ai didi

c++ - 删除向上转换为基指针的对象数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:12 24 4
gpt4 key购买 nike

开始将一些库从 msvc 移动到 mingw,并发现当有人想要删除一个 array upcasted objects 时 msvc 的非常有趣的行为。即 msvc 做了一些黑魔法(它似乎喜欢这样做)并且波纹管代码执行得很好,但是在 mingw 中(4.7.2(崩溃。我相信 mingw 正在正确执行并且它的 msvc 巫术就是制作睡虫。

代码:

#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]);

除了重新设计库(不是我的)之外,还有更好的方法吗?

最佳答案

在标准规范第 5.3.5 节第 3 段中,关于 delete 运算符:

[...] In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.

所以确实,在这种情况下,您不应该依赖 Visual C++ 的温和行为,并尝试为数组 delete 运算符提供正确类型的指针,这基本上意味着在您的情况。

您可以通过使用 vector 实例来存储逐个分配的向上转换对象来避免该问题。

关于c++ - 删除向上转换为基指针的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16575566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com