尝试访问数组中的对象成员变量时发生访问冲突

时间:2019-05-01 00:30:16

标签: c++ pointers

我的程序/分配是一个“动物模拟”,涉及从动物基类继承的不同物种动物对象的动态数组[不能使用矢量]。但是我的问题似乎很简单(我希望如此):

我一直在使用结构

Animal **arr = new Animal*[10];

但是读取arr[0]->getAge()会导致访问冲突。

我试图同时理解指针,但由于期限的原因,也许还希望对代码有完整的预理解。

我尝试过

*arr = new Animal[10]

但是当我想添加/更改数组中的对象或删除数组时遇到问题。也许

**新* *

仅适用于某些变量类型,不适用于类对象。我可以用

设置一个数组
*arr = new Animal[10];

形成,但是当我尝试设置类似的东西

 arr[05] = to a new Tiger object, 

什么都没有改变,所以我碰壁了。

基本上,我需要初始化Animal对象的数组,然后将继承的类对象添加到该数组。感谢您的见解和歉意。

2 个答案:

答案 0 :(得分:3)

Animal **arr = new Animal*[10];

Animal **arr声明一个指向指针的指针。 new Animal*[10]分配10个指向Animal的指针。这10个指针尚未初始化,并且没有指向安全使用的任何地方。

arr[0]->getAge();

获取这10个指针的首位并尝试使用其指向的指针。由于它没有指向有效的Animal,因此可能会发生任何事情。在这种情况下,程序似乎崩溃了。这是更好的结果之一,因为它会使错误立即引起注意。

现在假设Tiger来自Animal

class Tiger: public Animal
{
    // definition of Tiger
}

那么您以后就可以

arr[0] = new Tiger;

将10个指针中的第一个指向Tiger的有效实例,然后可以

arr[0]->getAge();

完成后,请不要忘记delete的所有Animaldelete[] arr

旁注:

不要这样写代码。这非常容易出错。而是利用std::vector之类的标准库容器,而更喜欢std::unique_ptr之类的智能指针来管理程序的动态内存。示例:

std::vector<std::unique_ptr<Animal>> arr;

制作一个Animal的可调整大小的数组,当不再需要arr并且超出范围时,它们将全部删除。

添加Tiger就像

arr.push_back(std::make_unique<Tiger>());

这看起来比较麻烦,但是它使您不必在代码中查找必须delete的资源的确切位置,并且可以绝对确定它们delete的位置。

答案 1 :(得分:0)

您已经分配了一个指针数组,但实际上并没有为这些指针指向分配任何对象。因此arr[0]->...是未定义的行为。