C++ 调用delete、c++;

C++ 调用delete、c++;,c++,pointers,memory,heap,C++,Pointers,Memory,Heap,我必须创建一个类,一个Employee类和一个BankAccount类,Employee类将BankAccount类作为私有变量指针 这就是我想做的: 我需要在每个员工中设置所有银行账户s,并使用值 然后,我在函数结束时删除每个员工的所有银行账户 我使用Employee中的成员函数设置器设置BankAccount指针银行账户有一个私有变量,即金额。稍后,我在一个指针上调用delete,该指针应该指向每个银行帐户的内存地址。在我调用print查看每个员工的银行值之后,它仍在打印每个银行帐户的值 如

我必须创建一个类,一个
Employee
类和一个
BankAccount
类,Employee类将
BankAccount
类作为私有变量指针

这就是我想做的:

  • 我需要在每个
    员工
    中设置所有
    银行账户
    s,并使用值
  • 然后,我在函数结束时删除每个
    员工的所有
    银行账户
  • 我使用
    Employee
    中的成员函数设置器设置
    BankAccount
    指针<代码>银行账户
    有一个私有变量,即金额。稍后,我在一个指针上调用delete,该指针应该指向每个
    银行帐户的
    内存地址。在我调用print查看每个
    员工的银行值之后,它仍在打印每个
    银行帐户的值

    如果我调用delete,堆上的内存不应该被删除吗?当调用print时,不会为
    银行帐户
    输出任何内容吗

    代码如下:

    vector<Employee*> employees;
    
    //get employee full name & salary and return
    employees.push_back(get_employee_info());
    
    //setup their bank account
    setup_bank(employees);
    
    //make temp pointer to store bank memory address
    BankAccount * tempBankPtr;
    
    for (int i =0; i < employees.size(); i++) {
        tempBankPtr =employees[i]->get_bank();
        delete tempBankPtr // delete the heap object that pointer is pointing at
    }
    
    //print values
    for (int i =0; i< employees.size(); i++) {
        employees[i]->print();
    }
    
    这在设置库中调用

    void Employee::set_bank(Employee* e, double amount){
           bank = new BankAccount(amount);
    }
    
    如果我调用delete,堆上的内存不是应该被删除吗?当调用print时,不会为BankAccount输出任何内容吗

    没有

    删除内存中该位置的对象意味着它不再存在,因此不允许访问它

    因此,您的程序具有未定义的行为您必须确保没有取消引用无效指针

    如果我调用delete,堆上的内存不是应该被删除吗?当调用print时,不会为BankAccount输出任何内容吗

    没有

    删除内存中该位置的对象意味着它不再存在,因此不允许访问它


    因此,您的程序具有未定义的行为您必须确保没有取消引用无效指针

    这是一个很好的解释

    当您在指针上调用delete时,与上面建议的不同,您应该只看到以下内容

    • 执行析构函数
    内存没有设置为零或任何其他神奇值,因为这是一个非常昂贵的操作。当调用
    free
    时,如果这会导致调用
    sbrk
    则很大程度上取决于实现。后者将内存返回到操作系统

    例如,众所周知,AIX的内存管理非常复杂。您应该期望的是,实际上内存块将被标记为reallocatable,并且新对象可能会在地址指向后覆盖您的内存。在这之前,你们这些老员工很可能还在那里

    此外,与前面所述的不同,只要数据段没有减少,并且实际上对象仍然存在,您就可以很好地访问它,这只是因为只有您知道它

    这就是为什么在这种情况下,您没有得到SIGSEGV,正如您所期望的那样。当您分配一些东西,并且在内存区域中寻址指针执行任意代码时,您可能会得到它

    访问删除指针是未定义的行为,第二次删除它更危险。为了缓解这种情况,有许多技术,最简单的是封装和删除类析构函数上的指针。您应该将指针设置为nullptr


    简单性到此为止,因为您必须应用。因此,最好使用c++11提供的共享或唯一指针,暂时忽略这些问题

    这是一个很好的解释

    当您在指针上调用delete时,与上面建议的不同,您应该只看到以下内容

    • 执行析构函数
    内存没有设置为零或任何其他神奇值,因为这是一个非常昂贵的操作。当调用
    free
    时,如果这会导致调用
    sbrk
    则很大程度上取决于实现。后者将内存返回到操作系统

    例如,众所周知,AIX的内存管理非常复杂。您应该期望的是,实际上内存块将被标记为reallocatable,并且新对象可能会在地址指向后覆盖您的内存。在这之前,你们这些老员工很可能还在那里

    此外,与前面所述的不同,只要数据段没有减少,并且实际上对象仍然存在,您就可以很好地访问它,这只是因为只有您知道它

    这就是为什么在这种情况下,您没有得到SIGSEGV,正如您所期望的那样。当您分配一些东西,并且在内存区域中寻址指针执行任意代码时,您可能会得到它

    访问删除指针是未定义的行为,第二次删除它更危险。为了缓解这种情况,有许多技术,最简单的是封装和删除类析构函数上的指针。您应该将指针设置为nullptr


    简单性到此为止,因为您必须应用。因此,最好使用c++11提供的共享或唯一指针,暂时忽略这些问题

    因此,如果它不存在,它如何仍然能够打印原始值?在使用“删除”之后,我仍然能够以打印方式访问它it@user2076774因为在你还没来得及重写它的时候,任何东西都有了记忆。(或者它还没有分配给其他对象)那么,我是否应该调用一个set_bank函数,在我删除“BankAccount”类后将其设置为null?@user2076774不,这意味着你不应该自己编写内存管理例程。@user2076774同样,请阅读的第一部分进行类比。如果它不存在,它是一个什么样的函数
    BankAccount* Employee::get_bank() const{
        return bank;
    }
    
    void Employee::set_bank(Employee* e, double amount){
           bank = new BankAccount(amount);
    }