簡體   English   中英

我是否正確刪除了指向對象的指針矢量?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM