C++ 涉及继承、取消分配指针对象以及何时这样做的问题

C++ 涉及继承、取消分配指针对象以及何时这样做的问题,c++,pointers,object,inheritance,C++,Pointers,Object,Inheritance,我目前在一个编程课上,发现老师并不擅长传达如何使用我们所教的概念。我已经搜索了多个关于我的主题的问题,但没有从中得到太多帮助。很抱歉,如果其中一些内容看起来类似 1) 在处理父对象/子对象时,假设您有一个类VehicLot,它将车辆对象子对象(摩托车对象、汽车对象、卡车对象)和这些对象的数量添加到矢量地块中。在这种情况下,我似乎无法理解发生了什么。我不确定我是否也正确地解除分配。(这是我脑子里想出来的,如果这是一个愚蠢的例子,那么很抱歉。这接近于我几周前遇到的问题。) void VehicLot

我目前在一个编程课上,发现老师并不擅长传达如何使用我们所教的概念。我已经搜索了多个关于我的主题的问题,但没有从中得到太多帮助。很抱歉,如果其中一些内容看起来类似

1) 在处理父对象/子对象时,假设您有一个类VehicLot,它将车辆对象子对象(摩托车对象、汽车对象、卡车对象)和这些对象的数量添加到
矢量地块中。在这种情况下,我似乎无法理解发生了什么。我不确定我是否也正确地解除分配。(这是我脑子里想出来的,如果这是一个愚蠢的例子,那么很抱歉。这接近于我几周前遇到的问题。)

void VehicLot::addVehic(int-typeNum,int-numVehic){
if(typeNum==1){
车*新车=新车();
对于(int i=0;i
那么,在这段代码中,这是否正确地添加了一个Car(在这段代码中是类型#1)对象,从而得到车辆的向量?如果是这样,我是否也正确地释放了内存?很抱歉,如果这些代码在其他方面不正确,我会在飞行中想出这个来模拟那些让我困惑的地方。是否创建了新对象以临时“使用”类函数将数据存储在其他对象中?为了进一步解释这一点,我之所以制作这些临时车辆对象,仅仅是为了将这些对象添加到一个向量中,这个向量实际上可以保存数据以供以后使用?这些问题导致问题2

2) 到目前为止,我在计算机科学领域遇到的最大问题之一是seg故障。经过一些研究,我发现这通常是由于访问了不存在的内存。这是一种合理的描述方式吗?你能给我一些关于seg故障的建议吗?由于我删除指针的概念似乎有点模糊,我假设我的问题在于没有正确删除指针/对象

由于我正在学习这方面的课程,我应该补充一点,我不知道我在这里看到的许多“捷径”。我需要理解我的问题,但也要有能力以我期望的方式做事。我真的很感激在这方面的任何帮助,因为我已经做了大量的研究,但只是无法理解我必须改进的地方

经过一些研究,我发现这通常是因为访问了不在“那里”的内存

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

当您声明一个数组时,比如说
intarr[3]
,编译器在内存中保留3个空间,每个空间的长度为8字节。现在,这个存储空间可以是任何地方;在此之后的内存块可分配给某些内部计算机进程。当您不小心试图访问它时,(比如说
arr[5]
),您正在查看超出您界限的内存。如果该内存块为空,程序将继续正常运行。但是,如果为另一个进程保留,则会遇到seg故障

这就是为什么它被称为未定义行为;如果您的代码触及不可访问的内存,您可能会遇到seg故障;如果您的程序占用了空内存,则可能会继续运行。不过,这两种方法都是错误的,您的数组不应该超出边界


希望这有助于

在您的示例代码中,您创建一个
车辆
对象,然后将指向它的
numVehic
指针复制到向量中,然后删除向量中所有这些指针指向的对象。所以向量中的所有指针都指向不再有效的内存

假设你想要向量中的独立cars,你应该做的是

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

但是,最好的解决方案是将
lot
的定义更改为
std::vector
,这样您根本不需要关心内存管理-编译器生成的包含
lot
成员变量的类的默认解构器将自动为您进行清理。此外,它还有助于识别您意外共享同一对象的位置(如前所述,这是您的示例中发生的情况),因为您无法复制唯一的\u ptr。

如果初学者课程教授手动内存管理,那么它可能不是很好。我可以说,我不一定是“初学者”。我想我会把它看作是那些知道基础知识的人,现在正在扩大。过去我做过很多事情,比如函数,递归,以及所有你可以认为是制作程序的“骨架”。它变得越来越详细,我很喜欢,但由于老师的原因(或者至少是他教的方式与我的学习方式相比),这门课似乎更难。到目前为止,我在计算机科学方面最大的问题之一是seg故障——问题不在于计算机科学——你在使用一种语言,
C++
,这取决于程序员自上而下地知道如何正确处理动态分配的内存。Java没有这样的“分段错误”需要处理。如果这门课是C++,如果他们想把你带到这条路径,最好的任务是尝试建立自己的工作<代码>向量或<代码> String 类,而不是使用“代码>新< /COD>和<代码>删除>代码>的“一次性”尝试。但我被他们给我的问题困扰着,所以我需要知道如何以“他们”希望我的方式解决这些问题。我个人认为这只会让我更难受,但哦,好吧。我这样做至少是正确的吗?不正确的是,你所做的只是在向量中存储相同的指针值。那有什么用?还有,y
void VehicLot::addVehic(int typeNum, int numVehic) {
    if(typeNum == 1){
        for(int i = 0; i < numVehic; i++) {
            lot.push_back(new Car{});
        }
    }
}
~ClassThatContainsLotVariable::ClassThatContainsLotVariable() {
    for (auto vehicle : lot) {
        delete vehicle;
    }
}