带有继承的new使用不当
Improper usage of new with inheritance?
我正在试图找出一个崩溃,并将其归结为以下示例:
class Base
{
public:
virtual unsigned int GetNum () = 0;
};
class Derived : public Base
{
int data; // <--- commmenting this out removes the crash
public:
Derived() {}
virtual unsigned int GetNum() { return 1; }
};
void func() {
Base** ppBases;
unsigned int xLen = 3;
unsigned int yLen = 4;
ppBases = new Base*[xLen];
for(unsigned int x = 0; x < xLen; ++x) {
ppBases[x] = new Derived[yLen];
for(unsigned int y = 0; y < yLen; ++y) {
Base* curBase = dynamic_cast<Base*>(&(ppBases[x][y]));
Derived* curDerived = dynamic_cast<Derived*>(&(ppBases[x][y])); // <--- crashes with a null dereference
unsigned int result = curBase->GetNum();
result = result;
}
}
}
我猜想Derived实际上并没有被分配适当的大小。将ppBases更改为三元组指针(像这样)可以使一切正常工作:
void func() {
Base*** ppBases;
unsigned int xLen = 3;
unsigned int yLen = 4;
ppBases = new Base**[xLen];
for(unsigned int x = 0; x < xLen; ++x) {
ppBases[x] = new Base*[yLen];
for(unsigned int y = 0; y < yLen; ++y) {
ppBases[x][y] = new Derived();
Base* curBase = dynamic_cast<Base*>(ppBases[x][y]);
Derived* curDerived = dynamic_cast<Derived*>(ppBases[x][y]);
unsigned int result = curBase->GetNum();
result = result;
}
}
}
我不明白为什么。
感谢
问题出在这行:
ppBases[x] = new Derived[yLen];
您正在将Derived
对象的数组分配给Base *
指针。因此,当您编写ppBases[x][y]
时,编译器会使用指针的类型Base *
,并适当地进行索引。因此,ppBases[x][1]
不引用所分配的数组中的第二个Derived
对象。
相关文章:
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在类c++中使用new声明数组
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- 在C++中,如果我可以直接将整数分配给指针而不使用"new",为什么要使用"new"?
- 是否可以使用 new 指定具有宏常量的动态分配数组的元素?
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- 在 Objective-C++ -> EXC_BAD_ACCESS Error 中使用"new"关键字
- 为什么 std::vector 使用 std::分配器而不是运算符 new 和 delete?
- 使用new创建数组而不声明大小
- 互斥 c++ 使用不当
- 返回功能的使用不当
- 由于指针使用不当而导致的未上线异常
- 类型特征C++使用不当
- 带有继承的new使用不当
- system()调用使用不当
- Malloc似乎比new[]使用更少的内存
- 如何检查new[]使用free()的结果
- 模板使用不当
- c_str使用不当
- 为什么这个initializer_list在传递字符串时使用不当行为