涉及继承,指针对象的交易以及何时进行的问题

Questions involving inheritance, Deallocation of pointer objects and when to do so

本文关键字:何时进 问题 交易 对象 继承 指针      更新时间:2023-10-16

我目前在编程课程中,发现老师不太擅长传达如何使用我们教授的概念。我搜索了有关我的主题的多个问题,但实际上无法从中获得太多帮助。对不起,如果其中一些似乎相似。

1(在与父/子对象打交道时,请说您有一个类VehicLot,该车辆添加了一个车辆对象(摩托车对象,汽车对象,卡车对象(以及这些对象的数量到vector <Vehicle*> lot中。在这样的情况下,我似乎无法理解发生了什么。我不确定我是否也适当地处理。(我想出的是我的头顶,很抱歉,如果这似乎是一个愚蠢的例子。

void VehicLot::addVehic(int typeNum, int numVehic) {
    if(typeNum == 1){
        Car* newCar = new Vehicle();
        for(int i = 0; i < numVehic; i++)
            lot.push_back(newCar);
    delete newCar;
    newCar = NULL;
    }
}

因此,在此代码中,这是否正确添加了汽车(在此将是#1(对象,以便车辆的向量?如果是这样,我是否也正确地处理了内存?抱歉,如果此代码中的任何一个不正确,我就可以随时提出这一点,以模拟使我感到困惑的区域。是否创建了为暂时"使用"类函数将数据存储在其他方面中的新对象?为了尝试进一步解释,我之所以使这些临时车辆对象仅将这些对象添加到一个可以实际使用以后使用数据的向量中?这些问题导致问题2。

2(到目前为止,我在计算机科学方面最大的问题之一就是SEG缺陷。经过一些研究,我发现这通常是由于访问不在"那里"的内存。这是描述它的合理方法吗?您能否提供有关我应该寻找与SEG故障有关的建议?由于我删除指针的概念似乎有些模糊,因此我假设我的问题在于无法正确删除指针/对象。

由于我正在参加课程,因此我应该补充说,我不知道我在这里看到的许多"快捷方式"。我需要了解我的问题,但也有能力按照我的期望做事。我真的很感谢您对此的任何帮助,因为我已经进行了大量研究,但无法理解我必须改进的地方。

经过一些研究,我发现这通常是由于访问不存在的记忆。

这意味着您要访问编译器为程序分配的内容之外的内存。

当您声明一个数组时,可以说int arr[3],您的编译器保留3个空间,每个空间为8个字节。现在,这个记忆空间可以在任何地方。在此之后的内存块可能会用于某些内部计算机过程。当您不小心尝试访问它时(例如arr[5](,您正在研究应该超出界限的内存。如果该内存块为空,则程序将继续正常运行。但是,如果它保留用于另一个过程,则遇到了SEG故障。

这就是为什么它被称为不确定的行为;如果您的代码触摸无法访问的内存,则可能会遇到SEG故障,否则您的程序可能会继续运行,如果它在空存储器上行驶。两者都是错误的,但是,您的数组不应该脱离界限。

希望这有帮助

在您是示例代码中您创建一个Vehicle对象,然后将numVehic指示复制到向量中,然后将其删除为向量中的所有这些点所指向的对象。因此,向量中的所有指针都指向不再有效的内存。

假设您想要独立 carsin the Vector,您应该做的是

void VehicLot::addVehic(int typeNum, int numVehic) {
    if(typeNum == 1){
        for(int i = 0; i < numVehic; i++) {
            lot.push_back(new Car{});
        }
    }
}

无需更改包含lot成员变量的类的破坏者,这将导致内存泄漏。因此,您需要调整该类别的攻击函数以循环循环向量中的所有元素,并在其上调用delete,这看起来与此相似

~ClassThatContainsLotVariable::ClassThatContainsLotVariable() {
    for (auto vehicle : lot) {
        delete vehicle;
    }
}

最好的解决方案是将lot的定义更改为std::vector<std::unique_ptr<Vehicle>>,这样您就不需要关心内存管理 - 编译器生成的持有lot成员变量的类的默认解体器将自动为您进行清理。此外,它将有助于确定您意外共享相同对象的地方(这是您的示例中发生的情况,如前所述(,因为您无法复制unique_ptr。