我是否正确删除了指向对象的指针向量?
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 循环并运行程序时,当析构函数被调用时,它会崩溃。 所以我的猜测是,这是正确的方法,因为指针已经全部删除,只需清除剩余的两个向量就足够了。
但我不太确定,真的很想听听专家对此的看法。
谢谢。
当我删除向量时,当我删除指向一个向量中的对象的指针并清除另一个向量时,这是否足够。
由于其他向量中的指针是副本,因此仅在一个向量中删除它们就足够了,而且删除副本实际上具有未定义的行为。您永远不希望程序具有未定义的行为。
清除File_Output
析构函数中的任何向量似乎是不必要的,假设向量是File_Output
的成员。这是因为成员无论如何都要被摧毁。
我是否正确删除了指向对象的指针向量?
假设您没有复制在其他地方删除的指针:是的,这是删除它们的正确方法。
您的代码存在内存泄漏:
CAN_Signal* can_signal = new CAN_Signal(s, i);
if (can_signal->read_line() == false)
return false;
如果该条件为 true,则新分配的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
赋值的实现更简单。
请注意,如果这样做,则必须reserve
元素的内存以进行can_signals
以防止重新分配,因为其他向量中的指针在重新分配时将失效。作为副作用,这使程序稍微快一点。
- 对象指针在c++中是如何工作的
- C++ 对象指针数组的复制构造函数
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 正确初始化和销毁对象指针的C++数组?
- 如何深度复制链表对象指针
- 对象指针 c++ 的全局向量错误
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 静态对象指针
- 正在将对象指针数组初始化为NULL
- 如何使用条件表达式返回对象指针?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 使用C对象指针构建PyObject*
- 如何在使用对象指针时访问成员函数
- 静态强制转换允许转换对象指针,但不允许转换整数
- C++ abort() 在函数内的抽象类对象指针调用上
- 指向函数的对象指针
- 访问指向对象指针向量的指针的第一个元素?
- 如何将对象/指针正确存储到 Qlist 中
- 对象指针打印结果以相反的顺序进行