假设我们想用C++声明一个函数,其中我声明了一个局部变量int p=new int [10];
,之后我做了一些操作,最后我做了一些操作,并且最后我用了return p;
。“新”会导致函数中的内存泄漏吗?
正如我们常说的,如果我们使用new
,我们必须delete
。但我认为在这种情况下,我们不应该删除,对吧?否则,它根本无法返回p,对吗?但是,我也在考虑在int main()
中测试它时是否应该删除该函数返回的项目。
假设我们想用C++声明一个函数,其中我声明了一个局部变量int p=new int [10];
,之后我做了一些操作,最后我做了一些操作,并且最后我用了return p;
。“新”会导致函数中的内存泄漏吗?
正如我们常说的,如果我们使用new
,我们必须delete
。但我认为在这种情况下,我们不应该删除,对吧?否则,它根本无法返回p,对吗?但是,我也在考虑在int main()
中测试它时是否应该删除该函数返回的项目。
的规则是,每new
必须有一个delete
(并为每一个new[]
delete[]
*),但它不一定是在同一范围内。通常有函数动态创建一个对象并将该对象的所有权转移给调用者。调用者然后将负责删除内存。
话虽这么说,你应该避免直接在你的代码中调用new
和delete
,并喜欢使用那些安全(带自动处理内存的你)其他结构。在你提到的特定情况下,用10个元素初始化的std::vector<int>
与指针相比几乎没有开销,并且确保只要对象被销毁就释放内存。
*根据您的实现,有可能是在那里你new
(或new[]
),而不是删除,如果内存是交给一个智能指针的情况。例如,在C++ 11你可以这样做:
std::unique_ptr<int[]> f() {
std::unique_ptr<int[]> p(new int[10]); // new is unmatched
// ...
return p;
}
这是好的,因为处理的指针std::unique_ptr
确保它会调用delete[]
内部,当它超出范围(如果没有移动到不同的智能指针)。
我总是害怕使用向量或列表或其他STL的原因是我不知道它们是否支持自动转换。例如,我声明了一个像inputsomething(矢量
@Cancan:不会,它不会从数组转换为vector,尽管使用'std :: vector'中提供的构造函数手动进行转换非常简单。另一方面,从'std :: vector'到一个指针,你可以传递'&v [0]'(即第一个元素的地址),因为矢量保证了元素的连续性。另一个问题是你是否想要使用原始数组。如果'std :: vector'成为* vocabulary *类型来处理元素序列,那么所有的函数都会使用它,并且不需要任何转换。 –
哦,这也很酷,你能告诉我哪个构造函数是将普通数组转换为向量? – Cancan
使用数组完成程序时应该删除。它不必处于相同的功能。
如果总是需要delete
做函数结束时,它会得到自动添加(unique_ptr
是一种方式告诉C++ 11自动免费的东西new
当函数结束)
呼叫者需要要知道你退回了创建的东西new []
,并在必要时致电delete []
。在这样的结构中有很多错误的可能性。更好地回报照顾自己记忆的东西,如std::vector
或std::unique_ptr
。
它们是从堆中分配的。所以你可以并且应该在函数外的任何地方删除。
新建和删除不使用堆栈。 malloc和free一样。
您可以delete []
p
在新的范围内它完成后返回它。然而,仅仅分配一个带有new
的内存并将所有权赋予另一个范围并不是一个好习惯。您可以使用std::vector
或smart pointers。
有没有理由不能使用'vector'? –
我问这个问题的关键是要弄清楚内存分配究竟如何工作 – Cancan
@ CanCan,虽然我理解你的分配问题,但我想强调NicolBolas是正确的,通常返回矢量是最好的解决方案。 –
tohava