问题标签 [memory-management]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
15 回答
205947 浏览

c++ - new/delete 和 malloc/free 有什么区别?

new/deletemalloc/和有什么不一样free

相关(重复?):在什么情况下我使用 malloc 与 new?

0 投票
3 回答
333 浏览

.net - 如何判断我的托管代码是否由于本机库调用而泄漏内存?

我有一个调用本机库的托管 dll。这个本机库通常返回 IntPtrs。这些可以传递给本机库中的其他方法来执行操作,或者告诉库释放与 IntPtr 关联的实例。但只有一些实例需要以这种方式释放,其他实例由库管理。问题是文档并不总是清楚地说明哪些实例必须被释放,哪些不能。

我想知道的是,是否有一种方法可以判断我的代码是否保留了对任何必须释放的指针的引用,从而导致内存泄漏?

0 投票
5 回答
15789 浏览

cocoa - 带有 _NSAutoreleaseNoPool 错误的 NSThread

我有一种将文件保存到互联网的方法,它可以工作但速度很慢。然后我想让用户界面更流畅,所以我创建了一个 NSThread 来处理慢任务。

我看到一个错误列表,例如:

没有 NSThread,我调用的方法如下:

我使用以下方法使用 NSThread 调用该方法:

谢谢。

0 投票
2 回答
4388 浏览

iphone - 如何使用导航控制器对 UIViewControllers 进行内存管理?

所以,是的,我是这个疯狂的 iPhone 世界中的 Java 人。当谈到内存管理时,我仍然对自己在做什么不是很清楚。

我有一个使用导航控制器的应用程序,当该进入下一个视图时,我的代码如下所示:

现在根据Apple关于内存管理的基本规则

如果您使用名称以“alloc”或“new”开头或包含“copy”(例如,、、或)的方法创建对象,或者向其发送消息,则您将获得alloc对象newObjectmutableCopy所有权retainrelease您有责任使用或放弃您拥有的对象的所有权autorelease。任何其他时间您收到一个对象,您都不能释放它。

对我来说,这意味着我应该发布myController,或者给它一个autorelease信息。但是,每当我尝试这样做时,我的应用程序都会在我从堆栈中推送和弹出视图时崩溃。

这对我来说并不合适,但在运行 Instruments 时,它声称我没有任何内存泄漏。

所以我的问题是

  1. 我这样做对吗?
  2. 导航控制器是否获得了 MyViewController 的所有权,解释了没有内存泄漏?
  3. 我应该将 myController 分配给我的根 ViewController 中的实例变量吗?在这种情况下,它将被标记为保留,我将在根的 dealloc 方法中释放
0 投票
7 回答
6631 浏览

c++ - 为什么我们甚至需要“delete[]”操作符?

这是一个困扰我一段时间的问题。我一直认为 C++ 的设计应该使delete运算符(不带括号)即使与new[]运算符一起工作。

在我看来,写这个:

应该等同于分配一个包含 1 个元素的数组:

如果这是真的,那么delete操作符总是可​​以删除数组,我们就不需要delete[]操作符了。

delete[]在 C++ 中引入运算符有什么原因吗?我能想到的唯一原因是分配数组的内存占用很小(您必须将数组大小存储在某个地方),因此区分deletevsdelete[]是一个小的内存优化。

0 投票
7 回答
151539 浏览

c++ - 动态分配对象数组

我有一个包含动态分配数组的类,比如说

但现在我想为这些类创建一个动态分配的数组。这是我当前的代码:

但这炸得太厉害了。因为当循环迭代完成时(通过调用)创建的新A对象A(3)被破坏for,这意味着该myArray实例A的内部被delete []-ed。

所以我认为我的语法一定是非常错误的?我想有一些修复看起来有点矫枉过正,我希望避免:

  • A.
  • 使用vector<int>vector<A>所以我不必担心这一切。
  • 与其arrayOfAs成为一个A对象数组,不如让它成为一个A*指针数组。

我认为这只是一些初学者的事情,其中​​有一种语法在尝试动态分配具有内部动态分配的事物数组时实际上有效。

(此外,风格批评很受欢迎,因为我已经有一段时间没有使用 C++ 了。)

未来观众的更新:以下所有答案都非常有帮助。Martin 的被接受是因为示例代码和有用的“4 规则”,但我真的建议阅读它们。有些是错误的简洁陈述,有些则正确地指出了如何以及为什么vectors 是一个好方法。

0 投票
8 回答
15583 浏览

php - 可视化分析 PHP 应用程序的内存使用情况的工具

是否有任何免费软件或商业软件可以帮助分析 PHP 应用程序的内存使用情况?我知道 xdebug 可以生成跟踪文件,通过函数调用显示内存使用情况,但如果没有图形工具,数据很难解释。

理想情况下,我希望不仅能够查看总内存使用量,还能够查看堆上的对象以及与Jprofiler类似的引用它们的对象。

0 投票
7 回答
1298 浏览

delphi - 是否值得缓存由 Delphi 的内存管理器创建的对象?

我有一个创建和销毁数千个对象的应用程序。是否值得缓存和重用对象,还是 Delphi 的内存管理器足够快以至于多次创建和销毁对象并不是那么大的开销(与跟踪缓存相反)当我说值得时,我当然在寻找以提高性能。

0 投票
2 回答
931 浏览

delphi - 为什么 Delphi 的内存管理器在关机时会报告错误的内存泄漏?

我在关机时收到内存泄漏消息,说我正在泄漏某个对象的 3 个。不过,这有两个问题。

  1. 它只是间歇性地发生。我可以运行我的程序,完成完全相同的一系列步骤,(打开一个数据文件,显示它,然后再次关闭),有时会显示消息,有时不会。沿着这些代码路径没有调用 random() 或其他“非确定性”逻辑。

  2. 代码审查说报告的内存泄漏是不可能的;该对象仅在某个类中创建,并且在该类的析构函数中正确释放。(并且我实例化了超过三个父类的对象。并且在清理过程中不会引发异常。)

将跟踪输出添加到此类的构造函数和析构函数表明创建的每个对象都被销毁,即使内存管理器报告其他情况也是如此。所以我只能得出结论,这是一个误报。但是,将“RegisterUnexpectedMemoryLeak(self)”添加到构造函数会使消息消失。

有没有人见过这样的事情?知道可能是什么原因造成的吗?我几乎可以肯定物体没有泄漏,那么发生了什么?

0 投票
10 回答
190071 浏览

c - 如何创建动态大小的结构数组?

我知道如何创建一个结构数组但具有预定义的大小。但是,有没有办法创建一个动态的结构数组,使数组变得更大?

例如:

这可能吗?


我研究过这个:words* array = (words*)malloc(sizeof(words) * 100);

我想摆脱 100 并在数据进入时存储数据。因此,如果有 76 个数据字段进入,我想存储 76 而不是 100。我假设我不知道有多少数据即将到来进入我的程序。在我上面定义的结构中,我可以将第一个“索引”创建为:

但是我想在之后动态地将元素添加到数组中。我希望我足够清楚地描述了问题区域。主要挑战是动态添加第二个字段,至少这是目前的挑战。


但是,我取得了一些进展:

我做了一些错误检查,这就是我发现的。如果在我为 x 释放内存之后,我添加以下内容:

那么如果我尝试打印 x 我会得到一个我想要的错误。那么是不是免费功能不起作用,至少在我的编译器上?我正在使用开发人员??


谢谢,我现在明白了,原因是:

FirstName 是一个指向 char 数组的指针,它没有被 malloc 分配,只有指针被分配,在你调用 free 之后,它不会擦除内存,它只是将它标记为在堆上可用结束后来写的。- 马特·史密斯

更新

我正在尝试模块化并将我的结构数组的创建放在一个函数中,但似乎没有任何效果。我正在尝试一些非常简单的事情,我不知道还能做什么。它与以前的思路相同,只是另一个函数 loaddata 正在加载数据,并且在我需要进行一些打印的方法之外。我怎样才能让它工作?我的代码如下:

这个简单的测试代码崩溃了,我不知道为什么。错误在哪里?