2014-12-09 69 views
0

我不確定這是不是很好的編碼練習,所以如果我錯了,請糾正我。我應該刪除一個取消引用的指針數組嗎?

我需要一種方法來動態創建一個Transaction類並將該對象添加到一個Transaction對象的向量中。這是我做的:

class Transaction { 
    int data; 
    Transaction(int d) : data(d) {} 
}; 

class Container { 
    std::vector<Transaction> transactions; 
    void createTransaction(); 
}; 
void Container::createTransaction() { 
    int data; 
    std::cout << "Enter your data: "; 
    std::cin >> data; 
    Transaction t = new Transaction(data); 
    // In order to keep the object from destruction at end of function. 
    // Possibly could be done with static as well. 
    transactions.push_back(*t); 
} 

矢量是對象的矢量,而不是指針。這是否是我不需要刪除動態內存的情況,因爲它會在程序/作用域結束時自行刪除?

這是一個可怕的方式去動態創建對象和存儲它們?

+4

這種實現的內存泄漏可能不合需要。我沒有看到't' *動態分配的理由*。在輸入之後執行'transactions.emplace_back(data);'將其餘部分扔掉。 – WhozCraig 2014-12-09 11:52:45

回答

4

值語義適用:transactions.push_back(*t);將在您的std::vectort一個副本

因此,您仍然需要刪除爲原始對象分配的內存:任何new必須通過調用delete來匹配。


你可能不首先需要一個new,你可以做:

Transaction t(data); 
... 
transactions.push_back(t); 

注:

正如指出的馬特,Transaction t = new Transaction(data);甚至不編譯,你可能意思就像Transaction* t = new Transaction(data);

+0

這是不是很昂貴/被認爲是不好的做法?將對象放置在堆棧上,並用'tanstactions.push_back(t)'將其複製 – Gio 2014-12-09 12:18:21

0

你要麼存儲普通的對象或指針向量中的對象。當你在堆上創建對象,然後在向量中搜索簡單對象時,你正在畫線。

問題是誰會刪除這些對象?

默認情況下存儲矢量中的普通對象。但是,如果複製對象昂貴,或者沒有適當的方法來爲對象定義複製,或者您想保留多態行爲,那麼您將指針存儲在容器中。