删除向量中的动态元素

Deleting dynamic elements in a vector

我有一个包含向量的程序。该向量采用指向我在程序中动态创建的对象的指针。然后我希望从向量中删除这些动态对象。例如:

int main()
{
    vector<Account*> allAccounts;
    auto timeDone = chrono::system_clock::now();
    time_t transactionTime = chrono::system_clock::to_time_t(timeDone);
    Account* a1 = new Savings(0, "Savings");
    Account* a2 = new Current(0, "Current");
    allAccounts.push_back(a1);
    allAccounts.push_back(a2);
    Transaction* initialTransaction = new Transaction("Initial Deposit", transactionTime, balanceAnswer);
    allAccounts[0]->addTransaction(initialTransaction);
    allAccounts[1]->addTransaction(initialTransaction);
    for (int i = 0; i < allAccounts.size(); i++) 
    {
        delete allAccounts[i]; //deletes all dynamically created accounts
    }
}

我相信这样做很好,但是我开始怀疑这是否正确删除了向量中的指针。但是我在删除后使用了 cout << allAccounts.size(),它仍然给出了 2 的大小,就好像帐户指针仍在向量中一样。

这是注定要发生的吗?

另一个注意事项是 Account 对象也有一个动态指针向量,该向量从函数中的 main 传递 (allAccounts[i]->addObject(object)),然后这些对象在同一个析构函数中被删除方法。这也是一件有效的事情吗? 为了消除我的担忧,这就是我在帐户中所做的:

float balance;
string accountType 
private vector <Transaction*> history;
Account::Account(float b, string a) 
{
    balance = b;
    accountType = a;
}
void Account::addTransaction(Transaction* t)
{
    history.push_back(t); 
}
Account::~Account() 
{
    for (int i = 0; i < history.size(); i++) 
    {
        delete history[i];
    }
    history.clear();
}

你所做的很好(假设 Account 有一个 virtual 析构函数)并且没有内存泄漏。 vector 的大小不受删除存储在其中的指针的影响。

析构函数需要 virtual 才能使您的程序具有 未定义的行为

我建议在 vector 中存储一个智能指针,如 std::unique_ptr<Account>。当vector.被销毁时,这将使存储的对象自动销毁。