【问题标题】:Deleting dynamic elements in a vector删除向量中的动态元素
【发布时间】:2022-01-25 22:10:43
【问题描述】:

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

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 &lt;&lt; allAccounts.size(),它的大小仍然为2,就好像帐户指针仍在向量中一样。

这是注定要发生的吗?

另一个注意事项是,Account 对象还有一个动态指针向量,该向量从函数 (allAccounts[i]-&gt;addObject(object)) 中的 main 传递,然后这些对象以相同的方式在析构函数中被删除。这也是一个有效的事情吗? 只是为了让我摆脱烦恼,这就是我所做的:

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

【问题讨论】:

  • std::vector&lt;std::unique_ptr&lt;Account&gt;&gt; 可能更安全。
  • 在循环后添加allAccounts.clear();。相关:https://en.cppreference.com/w/cpp/container/vector/clear
  • 这是注定要发生的吗?是的。您的 delete 释放了指针指向的对象。您的向量包含一个指针向量。它不关心指针是否指向有效内存。 delete allAccounts[i]; 不会从向量中删除指针。它释放allAccounts[i];指向的对象
  • 哦,是的,我现在记得了,我忘记了指针本身没有被删除。

标签: c++ pointers vector dynamic


【解决方案1】:

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

析构函数必须是virtual 才不会导致您的程序有未定义的行为

我建议在 vector 中存储一个类似 std::unique_ptr&lt;Account&gt; 的智能指针。这将在 vector. 被销毁时自动销毁存储的对象。

【讨论】:

  • 帐户没有虚拟析构函数,它确实有析构函数,因为它本身也有另一个动态对象向量。派生对象没有析构函数,因为向量仅在基类中使用和存储。它仍然需要是虚拟的吗?
  • 以防万一您需要查看它,我已对我的问题进行了修改以包含析构函数
  • @RadioCode345 我在答案中添加了一条评论。
  • 谢谢你的帮助,我现在一定要把析构函数虚拟化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
相关资源
最近更新 更多