我刚刚发现你可以用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的第一个对象一样。
答案 0 :(得分:3)
该对象不会被删除:delete
没有对其分配的new
的调用进行相应的调用。将它分配给pointe然后删除它并避免内存泄漏。
更好的替代品:
Line(5).GetLength()
将调用Line的析构函数并释放在该行之后自动分配的任何内存(在堆栈上),因为临时未命名对象超出了范围。std::make_unique<Line>(5)->GetLength()
。在引擎盖下,这确实在堆上分配了new
行。 Aterwards,同样的故事:当这个创建的unique_ptr超出范围时,它的析构函数被调用,然后调用相应的delete
。答案 1 :(得分:2)
祝贺发现“内存泄漏”的概念。
冒险的下一步是了解std::unique_ptr
,std::shared_ptr
,std::make_unique
和std::make_shared
的所有内容,这将让您做同样的事情,但没有在整个地方泄露记忆。
而且,作为额外奖励,您不必再担心delete
任何事情。