Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个代码会泄漏内存吗?(参考文献,新增,但不删除)_C++_Memory Leaks - Fatal编程技术网

C++ 这个代码会泄漏内存吗?(参考文献,新增,但不删除)

C++ 这个代码会泄漏内存吗?(参考文献,新增,但不删除),c++,memory-leaks,C++,Memory Leaks,可能重复: 当我问这个问题时 一个新问题出现了,我在这篇文章中提出了这个问题 这个代码会泄漏内存吗 class my_class { ... }; my_class& func() { my_class* c = new my_class; return *c; } int main() { my_class& var1 = func(); // I think there is no memory leak. return 0; } 是的,它

可能重复:

当我问这个问题时

一个新问题出现了,我在这篇文章中提出了这个问题

这个代码会泄漏内存吗

class my_class
{
  ...
};

my_class& func()
{
  my_class* c = new my_class;
  return *c;
}

int main()
{
  my_class& var1 = func();

  // I think there is no memory leak.
  return 0;
}

是的,它确实会泄漏内存。
new
创建的所有内容都必须通过
delete
销毁。您的代码中有
new
,但没有
delete
。这立即意味着,泄漏了
new
ed内存。

是,您必须释放使用“new”操作符或使用“malloc”函数分配的对象u的每个实例。

确保在完成操作时使用“删除”清除内存。

确实会造成内存泄漏。看看这个例子:

int main()
{
  my_class var1;
  my_class& var2 = var1;
  ...
}

在这里,var1的析构函数只调用一次,如果你的假设是正确的,它将被调用两次。

在链接的帖子中,首先回答“你还没有解决任何内存泄漏问题。如果你是新的,那么你必须删除。”@Kerrek SB:对不起,但我不同意。当然,堆栈上的对象是一件非常好的事情,但是有许多正当的理由说明
new
是一个好主意。还有一个原因是,存在许多智能指针类,它们可以存在于堆栈上,并且在超出范围时会自动调用保留实例上的
delete
。然而,我同意这段代码很糟糕——尤其是因为引用和指针的丑陋混合。我不明白你为什么要再次发布这段代码。你第一个问题的答案都是说,你没有通过引用返回任何漏洞。@状态:现代C++有很多很好的方法来构造被管理的对象(我在想你,<代码> MaMaJuffy:<代码>),应该有很少的理由来物理地写出<代码>新的< /COD>表达式。好的,如果您正在实现自己的库函数(比如
make_unique
)。我不是说“永远”。。。只是非常小心:-)对于新手来说,我敢打赌总有比赤裸裸的
更好、更惯用的解决方案!如果你仍然怀疑我们,它就是你的朋友。而且,析构函数本身被调用并不能释放分配的内存。需要调用
operator delete
来执行实际释放。请注意,我并不是说这需要手动完成,编译器是自动完成的。不完全是这样。智能指针类(如:auto_ptr类)是一种特殊情况,它会自动删除内存。。。所以我非常讨厌它…@Stan:嗯,它使用
delete
来删除。从核心语言的角度来看,
auto_ptr
是一种用户定义的类型。在这方面,由
auto_ptr
隐式删除或由用户显式删除的情况没有太大区别。