如何删除堆中没有存储到变量指针的对象?

时间:2017-03-18 13:50:22

标签: c++ pointers heap-memory

我刚刚发现你可以用C ++做到这一点:

class Line
{
public:
    Line(int x) : _length(x) {}
    int GetLength() { return _length; }
private:
    int _length;
};

int main()
{
    Line* line = new Line(3); // instead of doing this
    std::cout << line->GetLength();

    std::cout << (new Line(5))->GetLength(); // you can instantiate the object directly without storing it in a pointer
}

现在我的问题是,在最后一行代码之后,long = 5的对象是否会在堆中立即被删除?如果没有,我们如何删除它,因为我们不能使用

delete line;

就像长度为3的第一个对象一样。

2 个答案:

答案 0 :(得分:3)

该对象不会被删除:delete没有对其分配的new的调用进行相应的调用。将它分配给pointe然后删除它并避免内存泄漏。

更好的替代品:

  • 只需使用堆栈:Line(5).GetLength()将调用Line的析构函数并释放在该行之后自动分配的任何内存(在堆栈上),因为临时未命名对象超出了范围。
  • 使用std::make_unique<Line>(5)->GetLength()。在引擎盖下,这确实在堆上分配了new行。 Aterwards,同样的故事:当这个创建的unique_ptr超出范围时,它的析构函数被调用,然后调用相应的delete

答案 1 :(得分:2)

祝贺发现“内存泄漏”的概念。

冒险的下一步是了解std::unique_ptrstd::shared_ptrstd::make_uniquestd::make_shared的所有内容,这将让您做同样的事情,但没有在整个地方泄露记忆。

而且,作为额外奖励,您不必再担心delete任何事情。