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);
}