我应该删除一个取消引用的指针数组吗?

Should I delete an array of dereferenced pointers?

本文关键字:引用 指针 数组 取消 一个 删除 我应该      更新时间:2023-10-16

我不确定这是否是良好的编码实践,所以如果我错了,请纠正我。

我需要一种方法来动态创建一个事务类并将对象添加到事务对象的向量中。这是我所做的:

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);
}
向量

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

这是动态创建和存储对象的糟糕方法吗?

值语义适用:transactions.push_back(*t);将在您的std::vector中推送t的副本

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


您可能首先不需要new,您只需执行以下操作:

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

注意:

正如 Matt 所指出的,Transaction t = new Transaction(data);甚至没有编译,你可能的意思是Transaction* t = new Transaction(data);

您可以存储普通对象或指向矢量中的对象的指针。当您在堆上创建对象,然后在矢量中描写普通对象时,您将在两者之间的某个位置绘制线条。

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

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