c++ - 指针释放和堆内存,c++

标签 c++ pointers memory memory-management heap-memory

我有一个我调用的成员函数,从那里我得到一个指向类 BankAccount 的私有(private)成员的指针,我不确定当我释放它们时指针会发生什么。我创建了一个新的指针和堆内存地址,然后将指针分配给其他东西。 “删除”最终删除了什么?

我读到如果你删除一个指针

这是代码

void Employee::raise(){

    BankAccount* tempBank = new BankAccount(); //set pointer to new heap place

    double amt;

    tempBank = get_bank(); // set pointer to existing heap implicitly
    amt = tempBank->get_amount();
    amt = (amt + (amt/12));
    tempBank->set_amount(amt);


    delete tempBank; //does this delete new heap created or does it add a new block of
                     //memory to heap since it is trying to delete a pointer assigned 
                     //by memory address
    tempBank = NULL;
}

我意识到我可以只执行下面的代码来避免这种情况,但现在我很好奇在上述情况下内存会发生什么

BankAccount* tempBank = get_bank();

那么在我原来的情况下调用 delete 时到底发生了什么?

最佳答案

当你使用delete ptr;时,ptr指向的对象被销毁,相应的内存返回给内存管理系统。变量 ptr 及其任何拷贝都包含一个指向现在无法访问的内存的位模式(系统可能仍然允许您实际访问该内存,它甚至可能仍然包含原始数据,但这是未定义的行为,您不应依赖它)。

换句话说,内存释放不会影响指针,但会影响指向的实体。在您的情况下,BankAccount,即 *tempBank 的结果被销毁,而指针 tempBank 通过 delete< 保持不变 操作。显然,将 tempBank 设置为 NULL 确实会更改此特定指针,但不会更改其他拷贝(如果有),给您错误的安全感:我不会设置 删除d 指向NULL 的指针,除非我出于某种原因保留它们...

关于c++ - 指针释放和堆内存,c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34038534/

相关文章:

c++ - 取消引用指针会复制它吗?

c++ - 尽管遵循正常初始化,但我的数组拒绝成为正确的大小

java - 了解java中的垃圾收集

iphone - 使用 Cocoa 和 Objective-C 理解引用计数

c++ - 如何在构造函数上指定不可推导的模板参数?

c++ - WinXP 32 位上的互锁*64

c++ - std::vector 和 std::string 重新分配策略

c++ - 模运算符 (%) 给出不同的结果

c - 警告/检测指针减法,它们都没有指向数组成员

linux - Openfire Java 内存