【问题标题】:Should I delete an array of dereferenced pointers?我应该删除一组取消引用的指针吗?
【发布时间】:2015-02-07 07:19:40
【问题描述】:

我不确定这是否是一种好的编码习惯,所以如果我错了,请纠正我。

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

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

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

【问题讨论】:

  • 这种实现的内存泄漏可能是不可取的。我看不出动态分配t 根本的理由。在您输入之后执行transactions.emplace_back(data);,然后将其余的扔掉。

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


【解决方案1】:

应用值语义: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);

【讨论】:

  • 这不是非常昂贵/被认为是不好的做法吗?将对象放在堆栈上,并使用tanstactions.push_back(t) 复制它们
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 2010-10-30
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多