【发布时间】: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 << allAccounts.size(),它的大小仍然为2,就好像帐户指针仍在向量中一样。
这是注定要发生的吗?
另一个注意事项是,Account 对象还有一个动态指针向量,该向量从函数 (allAccounts[i]->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<std::unique_ptr<Account>>可能更安全。 -
在循环后添加
allAccounts.clear();。相关:https://en.cppreference.com/w/cpp/container/vector/clear -
这是注定要发生的吗?是的。您的 delete 释放了指针指向的对象。您的向量包含一个指针向量。它不关心指针是否指向有效内存。
delete allAccounts[i];不会从向量中删除指针。它释放allAccounts[i];指向的对象 -
哦,是的,我现在记得了,我忘记了指针本身没有被删除。
标签: c++ pointers vector dynamic