[英]Am I deleting my vector of pointers to objects correctly?
我目前正在編程,我從各種CAN信號中讀取信息,並將其存儲在3個不同的向量中。 對於每個信號,將創建一個指向對象的新指針,並將其存儲在兩個向量中。 我的問題是,當我刪除向量時,是否足夠,當我刪除一個向量中指向對象的指針並清除另一個向量時。
這是我的代碼:
向量聲明的迭代器:
std::vector <CAN_Signal*> can_signals; ///< Stores all CAN signals, found in the csv file
std::vector <CAN_Signal*> can_signals_rx; ///< Stores only the Rx CAN signals, found in the csv file
std::vector <CAN_Signal*> can_signals_tx; ///< Stores only the Tx CAN signals, found in the csv file
std::vector <CAN_Signal*>::iterator signal_iterator; ///< Iterator for iterating through the varoius vectors
填充向量:
for (unsigned int i = 0; i < m_number_of_lines; ++i)
{
string s = csv_file.get_line(i);
CAN_Signal* can_signal = new CAN_Signal(s, i);
if (can_signal->read_line() == false)
return false;
can_signal->generate_data();
can_signals.push_back(can_signal);
if (get_first_character(can_signal->get_PDOName()) == 'R')
{
can_signals_rx.push_back(can_signal);
}
else if (get_first_character(can_signal->get_PDOName()) == 'T')
{
can_signals_tx.push_back(can_signal);
}
else
{
cout << "Error! Unable to detect whether signal direction is Rx or Tx!" << endl;
return false;
}
}
刪除向量:
File_Output::~File_Output()
{
for (signal_iterator = can_signals.begin(); signal_iterator != can_signals.end(); ++signal_iterator)
{
delete (*signal_iterator);
}
can_signals.clear();
//for (signal_iterator = can_signals_rx.begin(); signal_iterator != can_signals_rx.end(); ++signal_iterator)
//{
// delete (*signal_iterator);
//}
can_signals_rx.clear();
//for (signal_iterator = can_signals_tx.begin(); signal_iterator != can_signals_tx.end(); ++signal_iterator)
//{
// delete (*signal_iterator);
//}
can_signals_tx.clear();
cout << "Destructor File_Output!" << endl;
}
當我取消注釋注釋的for循環並運行Programm時,調用析構函數時它將崩潰。 所以我的猜測是,這是正確的方法,因為指針已經全部刪除,並且足以清除其余兩個向量。
但是我不確定,也很想聽聽專家對此的意見。
非常感謝你。
當我刪除矢量時,是否足夠,當我刪除一個矢量中指向對象的指針並清除另一矢量時,就足夠了。
由於其他向量中的指針是副本,因此僅在一個向量中刪除它們不僅足夠,而且刪除副本實際上將具有不確定的行為。 您永遠都不希望您的程序具有未定義的行為。
清除任何在的析構函數矢量的File_Output
似乎是不必要的,假設矢量是成員File_Output
。 這是因為這些成員無論如何都將被銷毀。
我是否正確刪除了指向對象的指針矢量?
假定您沒有復制要在其他地方刪除的指針的副本:是的,這是刪除指針的正確方法。
您的代碼存在內存泄漏:
CAN_Signal* can_signal = new CAN_Signal(s, i);
if (can_signal->read_line() == false)
return false;
如果該條件成立,則新分配的CAN_Signal
將泄漏,因為函數返回時指針既不會刪除也不存儲在任何地方。
您的代碼不是異常安全的:如果這些行中的任何一條拋出,則指針將泄漏。
if (can_signal->read_line() == false)
return false;
can_signal->generate_data();
can_signals.push_back(can_signal);
目前尚不清楚,為什么首先要使用顯式內存管理。 除非有原因,否則建議您不要這樣做,而應使用std::vector <CAN_Signal> can_signals
。 這將解決內存泄漏和異常安全問題,消除實現自定義析構函數的需要,並使File_Output
的復制/移動構造函數/賦值的實現File_Output
簡單。
請注意,如果這樣做,則必須為can_signals
的元素reserve
內存,以防止重新分配,因為其他向量中的指針將在重新分配時失效。 副作用是,這會使程序速度稍快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.