假设我们想在 C++ 中声明一个函数,我在其中声明一个局部变量int p=new int [10];
,然后我做了一些操作,最后 I return p;
.
正如人们常说的,如果我们使用new
,我们必须delete
。但我认为在这种情况下,我们不应该删除,对吧?否则,它根本无法返回 p ,对吧?但是,我也在考虑是否应该删除函数在测试时返回的项目int main()
。
假设我们想在 C++ 中声明一个函数,我在其中声明一个局部变量int p=new int [10];
,然后我做了一些操作,最后 I return p;
.
正如人们常说的,如果我们使用new
,我们必须delete
。但我认为在这种情况下,我们不应该删除,对吧?否则,它根本无法返回 p ,对吧?但是,我也在考虑是否应该删除函数在测试时返回的项目int main()
。
规则是对于每个new
必须有一个(delete
并且对于每个*),但它不必在同一范围内。让函数动态地创建一个对象并将该对象的所有权转移给调用者是很常见的。然后调用者将负责删除内存。new[]
delete[]
话虽如此,您应该避免在代码中直接调用new
和delete
,而更喜欢使用其他安全的构造(自动为您处理内存)。在您提到的特定情况下,std::vector<int>
使用 10 个元素初始化的指针对指针的开销很小,并且将确保在对象被销毁时释放内存。
*根据您的实现,如果内存被交给智能指针,则可能存在您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[]
当它超出范围时它会在内部调用(如果没有移动到不同的智能指针)。
调用者需要知道您返回了使用创建的内容new []
,并delete []
在必要时调用。这种结构有很大的错误空间。最好返回一些照顾自己记忆的东西,例如 anstd::vector
或 an std::unique_ptr
。
当程序使用数组完成时,应该进行删除。它不必在同一个函数中。
如果delete
函数结束时总是需要完成,它会自动添加(unique_ptr
是一种告诉 C++11new
在函数结束时自动释放某些东西的方法)
它们是从堆中分配的。所以你可以而且应该在函数之外的任何地方删除。
新建和删除不使用堆栈。malloc 和 free 也是一样。
您可以delete []
p
在完成后在新范围内返回它。但是,仅将内存分配new
给另一个作用域并将所有权授予另一个作用域并不是一个好习惯。您可以使用std::vector
或智能指针。