【问题标题】:How to handle the heap memory garbage?如何处理堆内存垃圾?
【发布时间】:2019-11-26 22:53:51
【问题描述】:

所以我有这段代码,其中创建了 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);
        }
}

【问题讨论】:

  • 你可以使用智能指针吗?
  • 我假设你想在while 循环之后使用pb。如果是这样,那么pb 的声明属于while 之前。就像现在一样,pbwhile 迭代结束时超出范围,将无法用于任何事情。
  • 并非如此。这是一个学校项目,老师不喜欢语言的新特性。应该是老办法。
  • @uneven_mark 但 new 关键字是否也在堆中为其创建内存?因此,即使在 while 循环结束后它也应该保持不变,否则我弄错了?
  • @Fiphe 正如 user4581301 在我的回答中指出的那样,如果你得到错误的值,你很可能违反了课堂上的 rule of 0/3/5。您需要始终遵守该规则。

标签: c++ garbage


【解决方案1】:

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

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

(需要#include&lt;memory&gt;

【讨论】:

  • 这是执行此操作的“正确”方式,但在尝试之前绝对确定PiggyBank 正确观察the Rule of Three, Five, or Zero
  • @user4581301 是的,但是在任何情况下都需要满足 0/3/5 的规则(否则它只是一个等待显现的错误)并且不一直使用 new 会让这更容易。使用 new 来避免出现 0/3/5 规则的问题是错误的方法。
  • 是的,但是顺序很重要。使用不兼容的类修复代码,并且修复看起来不起作用。如果修复不起作用,提问者会走开,并且可能会做一些看起来似乎有效的愚蠢操作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2013-04-25
  • 2016-07-31
相关资源
最近更新 更多