删除向量中的动态元素
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
.被销毁时,这将使存储的对象自动销毁。
我有一个包含向量的程序。该向量采用指向我在程序中动态创建的对象的指针。然后我希望从向量中删除这些动态对象。例如:
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
.被销毁时,这将使存储的对象自动销毁。