[英]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.