当前位置: 首页 > 知识库问答 >
问题:

如何处理堆内存垃圾?

习海
2023-03-14

我有一段代码,其中创建了一个PiggyBank对象。根据选择,有三个if语句。由于关键字new在堆中分配对象,我应该如何正确管理内存垃圾,因此当创建不同类型的构造函数时,旧的存钱罐将消失,如下代码所示:

while(fChoice!=""){
        showFunctions();
        PiggyBank *pb;

        cin>>fChoice;
        cin.ignore(numeric_limits<streamsize>::max(),'\n');

        if(fChoice=="a") {
            pb = new PiggyBank();
        }
        else if (fChoice=="b"){
            cout<<"ENTER NAME:"<<endl;
            string name = "";
            cin>>name;
            pb = new PiggyBank(name);
        }
        else if (fChoice=="c") {
            cout<<"ENTER NAME:"<<endl;
            string name = "";
            cin>>name;
            cout<<"ENTER STARTING BALANCE:"<<endl;
            int startBalance = 0;
            cin>>startBalance;
            pb = new PiggyBank(name,startBalance);
        }
}

共有1个答案

左丘子平
2023-03-14

首先不要使用动态内存分配。这里没有明显的原因:

while(fChoice!=""){
        showFunctions();
        PiggyBank pb;

        cin>>fChoice;
        cin.ignore(numeric_limits<streamsize>::max(),'\n');

        if(fChoice=="a") {
            pb = PiggyBank();
        }
        else if (fChoice=="b"){
            cout<<"ENTER NAME:"<<endl;
            string name = "";
            cin>>name;
            pb = PiggyBank(name);
        }
        else if (fChoice=="c") {
            cout<<"ENTER NAME:"<<endl;
            string name = "";
            cin>>name;
            cout<<"ENTER STARTING BALANCE:"<<endl;
            int startBalance = 0;
            cin>>startBalance;
            pb = PiggyBank(name,startBalance);
        }
}

(当然,这里对PiggyBank的定义有一定的依赖性)

如果你需要动态分配(你最好有一个非常好的理由),使用std::unique_ptr这是一个智能指针,当删除超出范围或被分配时,它会自动为你处理删除新指针。

while(fChoice!=""){
        showFunctions();
        std::unique_ptr<PiggyBank> pb;

        cin>>fChoice;
        cin.ignore(numeric_limits<streamsize>::max(),'\n');

        if(fChoice=="a") {
            pb = new PiggyBank();
        }
        else if (fChoice=="b"){
            cout<<"ENTER NAME:"<<endl;
            string name = "";
            cin>>name;
            pb = new PiggyBank(name);
        }
        else if (fChoice=="c") {
            cout<<"ENTER NAME:"<<endl;
            string name = "";
            cin>>name;
            cout<<"ENTER STARTING BALANCE:"<<endl;
            int startBalance = 0;
            cin>>startBalance;
            pb = new PiggyBank(name,startBalance);
        }
}

(需要#包括

 类似资料:
  • 我正在尝试重新实现malloc,我需要理解对齐的目的。据我所知,如果内存对齐,代码将执行得更快,因为处理器不必采取额外步骤来恢复被剪切的内存位。我想我理解64位处理器读取64位逐64位内存。现在,让我们想象一下,我有一个有序的结构(没有填充):一个char、一个short、一个char和一个int。为什么short会错位?我们有区块中的所有数据!为什么地址必须是2的倍数。整数和其他类型的问题是一样

  • 问题内容: 如何在Python中管理变量和内存?它有堆栈和堆吗?用于管理内存的算法是什么?有了这些知识,对于大量/数据处理的内存管理有什么建议吗? 问题答案: 如何在Python中管理变量和内存。 自动地!不,真的,您只是创建一个对象,Python虚拟机将处理所需的内存以及将其放置在内存布局中的位置。 它有堆栈和堆吗?用于管理内存的算法是什么? 当我们谈论它时,使用 私有堆 来存储对象。从CPyt

  • 本文向大家介绍java 中堆内存和栈内存理解,包括了java 中堆内存和栈内存理解的使用技巧和注意事项,需要的朋友参考一下  Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存

  • 问题内容: 谁能 建议一本书 (或任何其他来源)来彻底揭示 JVM内存管理和垃圾回收的内部知识 (优化,工作,循环引用,特殊性,各种JVM隐喻的讨论…)? [到目前为止,我发现的是单独的文章,涉及各个方面,但没有重量级的书:)。这里是一些用于实施Hotspot的好材料。] 非常感谢您提供的任何建议。 问题答案: 如果您寻找与 供应商无关的 资源来揭示和彻底描述所有已研究/设计的各种GC算法,我建议

  • 内存是一种你不可以耗尽的珍贵资源。在一段时期里,你可以无视它,但最终你必须决定如何管理内存。 堆内存是在单一子程序范围外,需要持续(保留)的空间。一大块内存,在没有东西指向它的时候,是无用的,因此被称为垃圾。根据你所使用的系统的不同,你可能需要自己显式释放将要变成垃圾的内存。更多时候你可能使用一个有垃圾回收器的系统。一个垃圾回收器会自己注意到垃圾的存在并且在不需要程序员做任何事情的情况下释放它的内

  • 问题内容: 希望是一个简单的问题。以循环链接列表为例: 现在,由于它是一个循环链接的列表,因此当添加单个元素时,它的下一个变量中将引用自身。删除列表中的唯一元素时,条目设置为null。是否需要将ListContainer.next设置为null以便Garbage Collector释放其内存,还是可以自动处理此类自引用? 问题答案: 仅依靠引用计数的垃圾收集器通常很容易无法收集诸如此类的自引用结构