我应该删除一系列解除引用的指针吗?

时间:2014-12-09 11:49:18

标签: c++ vector dynamic-memory-allocation delete-operator

我不确定这是不是很好的编码练习,所以如果我错了请纠正我。

我需要一种动态创建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);
}

向量是对象的向量,而不是指针。这是一个我不需要删除动态内存的情况,因为它会在程序/范围结束时自行删除吗?

这是一种动态创建对象并存储它们的可怕方法吗?

2 个答案:

答案 0 :(得分:4)

值语义适用:transactions.push_back(*t);将推送tstd::vector副本

所以你仍然需要删除为原始对象分配的内存:通过调用new必须匹配任何delete


您可能首先不需要new,您可以这样做:

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

注意:

正如马特指出的,Transaction t = new Transaction(data);甚至没有编译,你可能意味着Transaction* t = new Transaction(data);

答案 1 :(得分:0)

您可以将普通对象或指针存储到向量中的对象。当你在堆上创建对象然后在向量中描绘普通对象时,你在两者之间画线。

问题是谁会删除这些对象?

默认情况下,将普通对象存储在矢量中。但是,如果对象的复制很昂贵,或者没有正确的方法来定义对象的复制,或者你想保留多态行为,那么你将指针存储到容器中。