【发布时间】:2018-02-27 10:47:04
【问题描述】:
我目前正在开发一个程序,我从各种 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 循环并运行程序时,它会在调用析构函数时崩溃。 所以我的猜测是,这是正确的做法,因为指针已经被删除,只需清除剩余的两个向量就足够了。
但我不太确定,也很想听听专家对此的意见。
非常感谢。
【问题讨论】:
-
改成
std::vector<std::unique_ptr<CAN_Signal>>就可以早点下班了。 -
测试似乎支持
new和delete的调用次数应该相同的规则。如果您遵循 Bathsheba 的建议并改用make_unique,您可以将数字降至零 - 这是非常相等的。 -
@Bathsheba 你介意发布一个如何使用它的例子吗?我无法弄清楚这是如何工作的。
-
@Bathsheba 为什么不简单地
std::vector <CAN_Signal>?
标签: c++ object memory vector iterator