2013-07-28 42 views
-1

假设我们想用C++声明一个函数,其中我声明了一个局部变量int p=new int [10];,之后我做了一些操作,最后我做了一些操作,并且最后我用了return p;“新”会导致函数中的内存泄漏吗?

正如我们常说的,如果我们使用new,我们必须delete。但我认为在这种情况下,我们不应该删除,对吧?否则,它根本无法返回p,对吗?但是,我也在考虑在int main()中测试它时是否应该删除该函数返回的项目。

+0

有没有理由不能使用'vector '? –

+1

我问这个问题的关键是要弄清楚内存分配究竟如何工作 – Cancan

+0

@ CanCan,虽然我理解你的分配问题,但我想强调NicolBolas是正确的,通常返回矢量是最好的解决方案。 – tohava

回答

5

的规则是,每new必须有一个delete(并为每一个new[]delete[]*),但它不一定是在同一范围内。通常有函数动态创建一个对象并将该对象的所有权转移给调用者。调用者然后将负责删除内存。

话虽这么说,你应该避免直接在你的代码中调用newdelete,并喜欢使用那些安全(带自动处理内存的你)其他结构。在你提到的特定情况下,用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[]内部,当它超出范围(如果没有移动到不同的智能指针)。

+0

我总是害怕使用向量或列表或其他STL的原因是我不知道它们是否支持自动转换。例如,我声明了一个像inputsomething(矢量 a)和delcare a这样的函数作为int a [10],它们会自动转换吗?或换句话说,如果我在函数中声明了一个,我可以声明任何其他类似的STL吗? – Cancan

+1

@Cancan:不会,它不会从数组转换为vector,尽管使用'std :: vector'中提供的构造函数手动进行转换非常简单。另一方面,从'std :: vector'到一个指针,你可以传递'&v [0]'(即第一个元素的地址),因为矢量保证了元素的连续性。另一个问题是你是否想要使用原始数组。如果'std :: vector'成为* vocabulary *类型来处理元素序列,那么所有的函数都会使用它,并且不需要任何转换。 –

+0

哦,这也很酷,你能告诉我哪个构造函数是将普通数组转换为向量? – Cancan

0

使用数组完成程序时应该删除。它不必处于相同的功能。

如果总是需要delete做函数结束时,它会得到自动添加(unique_ptr是一种方式告诉C++ 11自动免费的东西new当函数结束)

3

呼叫者需要要知道你退回了创建的东西new [],并在必要时致电delete []。在这样的结构中有很多错误的可能性。更好地回报照顾自己记忆的东西,如std::vectorstd::unique_ptr

0

它们是从堆中分配的。所以你可以并且应该在函数外的任何地方删除。

新建和删除不使用堆栈。 malloc和free一样。

0

您可以delete []p在新的范围内它完成后返回它。然而,仅仅分配一个带有new的内存并将所有权赋予另一个范围并不是一个好习惯。您可以使用std::vectorsmart pointers