没有' new'

时间:2018-02-27 02:49:47

标签: c++ list pointers scope

我对C ++很新,并且正在编写银行项目来练习。我使用列表来保存bank_account类型的指针,其中包含成员first_namelast_namebalance。在列表中添加条目后,我试图获取我添加的元素,但是当我到达get()方法时,名称不再存在。我认为这是因为指针超出范围并且在离开循环时可能被破坏。

bank.cpp:

中的get方法
bank_account* bank::get(const string &f_name, 
                        const string &l_name, 
                        const int &account_number) 
{
    for (auto it = bank::accounts.begin(); it != bank::accounts.end(); it++){
        bank_account curr_ba = **it;    //dereference twice
        std::cout << "Curr fname: " << curr_ba.first_name << std::endl;
        std::cout << "Curr lname: " << curr_ba.last_name << std::endl;
        std::cout << "Acct num: " << curr_ba.acct_num << std::endl;
        if (curr_ba.get_first_name() == f_name && 
             curr_ba.get_last_name() == l_name && 
             curr_ba.get_account_number() == account_number) {
            return *it;//dereferences the pointer, which leaves another pointer
    }
}

main.cpp:

bank bank;
while(more_user_input){
    //get first_name and last_name, assign account_number
    bank_account ba(first_name, last_name);
    bank_account *ba_ptr = &ba;
    bank.add_acct(ba_ptr);
    //Withdraw and deposit amts, add more people, etc. 
}
//get first name, last name, account number of desired person
bank_account *ba = (bank.get(f_name, l_name, acct_number));

这打印: 对于每个条目Curr fname:Curr lname:Acct num: some #,好像fnamelname已被破坏(我没有提供析构函数 - 使用默认值)。帐号保持不变。但是,如果我在main.cpp:

中更改这两行
bank_account ba(first_name, last_name);
bank_account *ba_ptr = &ba;

bank_account *ba_ptr = new bank_account(first_name, last_name);

它有效,我找到了元素,但我很困惑为什么。我知道new将事物添加到堆而不是堆栈中,这可能是列表中指针似乎超出范围的部分原因吗?除了vector对于大量访问更好的想法,并且我没有delete我的示例中的指针(并且应该使用智能指针),如果任何人都可以脱掉这一事实对于为什么一个有效,另一个无用,我真的很感激它。我是否正确在第一种情况下在列表中的指针上调用析构函数?

0 个答案:

没有答案