javascript

java

python

c#

android

node.js

reactjs

c++

php

html

jquery

css

.net

ios

git

ruby-on-rails

sql

c

string

ruby

在任何情况下new都将返回NULL?

我知道,根据C ++标准,万一新的分配内存失败,应该抛出std :: bad_alloc异常。 但是我听说有些编译器,例如VC6(或CRT实现?)不遵守它。 这是真的 ? 我之所以这样问是因为在每条新语句之后检查NULL会使代码看起来非常难看。

trans by 2020-01-14T15:51:10Z

iOS-深入了解保留周期

可以说我们有三个对象:祖父母,父母和孩子。 祖父母保留父母,父母保留子女,孩子保留父母。 祖父母释放父母。

在这种情况下会发生什么?

trans by 2020-01-14T07:45:02Z

CodeGo.net>使用对象初始化有什么好处?

使用C#对象初始化程序有什么好处?

在C ++中,没有引用,所有内容都封装在一个对象内,因此使用它们而不是在对象创建后初始化成员是有意义的。

在C#中使用它们的情况是什么?

如何:使用对象初始化程序初始化对象(C#编程指南)

trans by 2020-01-11T02:26:13Z

c ++-是否有任何原因使全局new和delete重载?

除非您要对OS或嵌入式系统的零件进行编程,否则是否有理由这样做? 我可以想象,对于某些经常创建和销毁的特定类,这些类经常会使内存管理功能超载或引入对象池,这可能会降低开销,但是在全局范围内执行这些操作?

加成
我刚刚在重载的删除功能中发现了一个错误-内存并不总是被释放。 那是在不太重要的内存应用程序中。 同样,禁用这些过载只会使性能降低约0.5%。

trans by 2020-01-09T00:08:24Z

android-查找和纠正堆大的原因

我正在尝试弄清为什么我的应用程序占用了如此多的内存。 我经常看到它使用15到18MB之间的内存,这大大高于我的预期。 我通过DDMS查看了堆大小,并看到了以下内容:

enter image description here

这看起来有点可疑,因为我的应用程序根本不处理大图像。 实际上,我的应用程序中可绘制的总和约为250KB。 因此,我创建了一个堆转储,并使用MAT定位了所有这些内存的去向。 byte []数组是迄今为止最大的使用者,因此我深入研究并注意到以下内容:

enter image description here

我完全不知道为什么sPreloadedDrawables会导致如此高的保留堆大小。 我也不知道如何确定根本原因或如何“解决”它。

我应该从这里去哪里? 我的应用程序通过完全不处理图像数据的服务在后台运行。 我确实有一些活动可供用户选择使用,但同样,他们使用的小可绘制对象无法解释这么大的堆大小。 我还检查了活动泄漏等是否有任何令人讨厌的事件,但没有找到。

编辑:我注意到,在仿真器中运行时,堆大小大大降低。 这很令人困惑。 :/

trans by 2020-01-06T15:28:25Z

内存管理-PHP中是否存在垃圾回收?

我知道在PHP中您不必释放内存。垃圾收集器可以到达吗?

trans by 2020-01-05T20:57:52Z

优化-GMSPolyline超大内存SPI

在允许用户显示复杂位置点列表的GPS应用程序中,我们将其称为各种不同类型的地图上的轨迹,每个轨迹可以包含2k至10k的位置点。 在非Google地图类型上渲染轨迹时,会对其进行大量剪切,修剪和路径简化。 这是为了减少内存使用量并提高性能。 通常,即使在最坏的情况下,我们通常只向OpenGL管道提交远远少于一千个(总计)转换的位置点。

在集成适用于iOS的Google Maps SDK时,我们最初尝试继续利用我们自己的OpenGL轨迹渲染系统,但是遇到了与OpenGL上下文用法冲突的问题(渲染有效,但是我们无法将GMSMapView应用于我们自己的内部OpenGL资源 两者都释放而没有人触摸已删除的内存)。

因此,我们试图利用GMSPolyline构造,仅让Google SDK进行轨迹渲染,但是我们遇到了主要的内存使用问题,并正在寻求解决这些问题的指南。

使用Xcode Instruments,当创建大约25条折线(总共不超过23k个位置点)时,我们监视了内存使用情况。 在折线创建过程中,应用程序内存使用量从约14 MB增加到约172 MB,净峰值约为158 MB。 创建完所有折线之后不久,内存使用量最终又下降到19 MB左右,并且看起来很稳定,累积净值约为5 MB,因此似乎每个位置点都需要大约220字节(5 MB / 23k点) 商店。

伤害我们的是峰值内存使用率。 尽管我们的实验室测试仅使用了23,000个定位点,但在现实世界中,通常会有更多的定位点,并且在Google Maps在iPhone 5上消耗了约450 MB的空间后,iOS似乎抛弃了我们的应用程序(而我们的内部折线渲染系统的峰值大约为 相同测试用例需要12 MB)。

显然,GMSPolyline构造不适用于我们所需的重磅用途。

我们尝试用单独的自动释放池包装一些折线创建循环,然后在适当的位置耗尽它们,但这对内存使用没有影响。 创建折线并将控制权返回到主运行循环后的峰值内存使用情况完全没有改变。 后来很清楚为什么。 在创建折线之后的第一个DisplayLink回调之前,Google Map系统不会释放资源。

我们的下一个工作将是手动限制在GMSPolyline上推送的数据量,可能使用我们自己的边界测试,裁剪,修剪和最小化,而不是依靠Google Maps有效地做到这一点。

这里的缺点是,这可能意味着将有更多的GMSPolyline对象被分配和释放,这可能是在用户平移/缩放地图时引起的。 这些对象中的每个对象都将具有更少的位置点,但是,我们仍然担心这种方法的意外后果,许多GMSPolyline分配和取消分配的隐藏开销。

所以问题是,解决这种情况的最佳方法是什么?Google的某人能否阐明任何GMSPolyline最佳做法,上限,瓶颈等?

trans by 2020-01-05T11:43:08Z

内存管理-找出.net obj的大小

我试图找出我的对象需要多少内存,以查看有多少对象最终出现在大对象堆(超过85,000字节)上。

是否像为一个整数添加4,为长整数添加8,为每个对象的任何引用类型等添加4(如果您使用64位,则为8)那样简单,还是方法,属性等存在开销?

trans by 2020-01-04T17:12:10Z

在Objective-C / iPhone应用程序中使用“经典” malloc()/ free()可以吗?

我从事iPhone开发已经有一段时间了,尽管当您是“硬核” .NET开发人员时感觉有点尴尬,但是一旦习惯了它并没有那么糟糕。

在我读到的有关Objective-C的每本书中,都只谈论关于内存管理的malloc()/free()(引用计数)。 作为老派的C / C ++开发人员,仅在一些脚注中提到使用malloc()free()分配“常规”方式似乎很奇怪。

我知道malloc()free()可在Objective-C中工作,但我很好奇它是否是常见做法。 毕竟,如果我要分配100个整数的数组,似乎这是最有效的方法:

int *array = malloc(sizeof(int) * 100);

memset(array,0,sizeof(int) * 100);

// use the array

free(array);

这确实是最好的方法,还是应该避免使用普通的C内存管理?

trans by 2020-01-01T21:59:55Z

如何在.NET中以编程方式测量当前进程的总内存消耗?

如何以编程方式在.NET中测量当前进程的总内存消耗?

trans by 2019-12-29T21:56:32Z

如何为IntelliJ Idea 9-11分配更多内存

这与Intellij从9到11有关。在右下角的IDEA窗口中,我看到当前的内存使用情况,通常为“ 224M of 254M”。我如何为Idea提供更多的内存,使其显示为“ 224M of 512M”?

谢谢。

trans by 2019-12-28T22:04:41Z

动态分配对象数组

这是一个初学者的问题,但是我很长一段时间没有做C ++,所以这里...

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

class A
{
    int* myArray;
    A()
    {
        myArray = 0;
    }
    A(int size)
    {
        myArray = new int[size];
    }
    ~A()
    {
        // Note that as per MikeB's helpful style critique, no need to check against 0.
        delete [] myArray;
    }
}

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

A* arrayOfAs = new A[5];
for (int i = 0; i < 5; ++i)
{
    arrayOfAs[i] = A(3);
}

但是,这非常可怕。 因为创建的新vector对象(使用A调用)在A*循环迭代完成时被破坏,所以这意味着A实例的内部myArray实例将获得delete []-ed。

所以我认为我的语法一定很错误吗? 我猜想有一些似乎过大的修补程序,我希望避免:

  • vector创建副本构造函数。
  • 使用vectorA,所以我不必担心所有这些。
  • 不是让vector对象是A对象的数组,而是让它成为A*指针的数组。

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

(此外,对样式的评论表示赞赏,因为自从我使用C ++已经有一段时间了。)

面向将来的观众的更新:以下所有答案确实很有帮助。 由于示例代码和有用的“ 4则规则”,Martin被接受了,但我确实建议阅读所有内容。 有些是关于错误之处的简洁明了的陈述,有些则正确指出了2674760767953953699840s如何以及为什么是一个不错的选择。

trans by 2019-12-26T13:11:56Z

泄漏仪器未显示泄漏时如何调试内存泄漏?

我有一个用Swift编写的iOS应用,正在泄漏内存-在某些情况下,应该释放某些对象,但不能释放。 我已经通过简单添加deinit调试消息来了解此问题:

deinit {
    println("DEINIT: KeysProvider released")
}

因此,应该在导致对象释放的事件之后在控制台中出现deinit消息。 但是,对于某些应释放的对象,该消息丢失。 尽管如此,Leaks Developer Tool仍未显示任何泄漏。 我该如何解决这种情况?

trans by 2019-11-15T16:14:47Z

在流行的实现中,动态内存分配在C和C ++中是否有所不同?

就相应的语言标准而言,C仅通过2614421648736536519168系列提供动态内存分配,而在C ++中,最常见的分配形式由261442164873651919169执行。C风格的malloc在C ++中也可用,许多“婴儿最早的” 分配器”示例将其用作其核心分配功能,但我很好奇当代编译器如何实现实际的生产操作符-new。

它只是malloc周围的一个瘦包装器,还是由于与典型C程序相比典型C ++程序的内存分配行为完全不同而实现了根本不同?

[编辑:我相信主要的区别通常描述如下:C程序具有更少,更大,寿命更长的分配,而C ++程序具有很多,很小,寿命短的分配。 如果错误输入,请随时鸣叫,但听起来像是从其中考虑,您会从中受益。]

对于像GCC这样的编译器,仅具有一个核心分配实现并将其用于所有相关语言会很容易,因此我想知道细节方面是否存在差异,这些差异会试图优化每种语言的最终分配性能。


更新:感谢您提供的所有出色答案! 看起来在GCC中,这是完全由ptmalloc解决的,而MSVC也以malloc为核心。 有谁知道如何实现MSVC-malloc?

trans by 2019-11-14T22:10:10Z

android-了解onTrimMemory(int level)

我最近阅读了有关管理应用程序内存的这篇文章,强烈建议您阅读,如果您是AndroidDev且从未使用过。

有很多好的做法,我从来没有碰过的一件事是系统在每个Activity / Fragment上调用onTrimMemory(int level)方法来通知应该或应该释放内存的事件。

这是该文章的引文:

请注意,您的应用程序收到带有以下内容的onTrimMemory()回调:   仅当您的应用程序的所有UI组件都为TRIM_MEMORY_UI_HIDDEN时   进程对用户隐藏了。 这与   onStop()回调,当Activity实例变为   隐藏,即使用户移动到   您的应用。 因此,尽管您应该实现onStop()才能发布   活动资源,例如网络连接或注销   广播接收器,通常不应该释放UI资源   直到收到onTrimMemory(TRIM_MEMORY_UI_HIDDEN)。 这样可以确保   如果用户从您应用程序中的另一个活动导航回来,   您的UI资源仍然可以用来快速恢复活动。

我真的很想在我的应用程序中实现良好的内存管理,因此我期待以正确的方式实现onTrimMemory()。

我对此只有几个问题:

  • 在onStop()之后立即调用onTrimMemory(TRIM_MEMORY_UI_HIDDEN)吗?

  • 在这种情况下,“释放UI资源”是什么意思? 仅用于清理位图缓存,还是实际上删除并销毁视图树中的每个视图? 我通常会在onDestroy()或onDestroyView()方法中破坏视图,现在我想知道自己是否做对了。

  • 在onTrimMemory(TRIM_MEMORY_UI_HIDDEN)上有一个Twin /通讯回叫吗? 例如onCreate-onDestroy,onStart-onStop,onCreateView-onDestroyView。 我要了解的是,在调用onTrimMemory(TRIM_MEMORY_UI_HIDDEN)后在前台引入的Activity / Fragment之后,应该在哪里以及如何恢复UI状态。

trans by 2019-11-13T08:08:30Z

如何正确替换全局new和delete运算符

首先,至少有4-5个主题,与SO相似。 我读了他们每个人,但我觉得他们并没有真正帮助我解决这个特定问题。 如果有人发现重复的问题,我深表歉意。 发布此文章之前,我已经完成了搜索工作,这似乎是一个非常常见的问题。

我在Windows 7上使用Visual Studio .NET 2003。

我有自己的new / delete重载,它们指向我自己的自定义调用malloc()和free()进行诊断。 我的新/删除重载在一个头文件中,我已经将其包含在几个文件中。

问题是,代码库几乎是意大利面条,没有简单的方法来确保这些重载能被所有东西使用。 有第三方库的黑匣子。 我们还在各处使用STL。

在测试中,我发现STL仍在混合对自己的new / delete和标准MSVC new / delete调用的混合。

将头文件包含在成千上万个其他文件中似乎并不现实,这将花费太长时间。 谁能提供一些技巧来提示如何正确有效地全局重载new / delete,以便一切都使用我的自定义内存管理器?

trans by 2019-11-06T05:38:00Z

r-gc()和rm()有什么区别

我正在通过调用gc()定期清理R中的内存。
之后,我需要致电垃圾收集器rm()吗?

这两个功能有什么区别? gc()是否为某些变量调用rm()

trans by 2019-10-27T02:05:05Z

内存管理-读取J中的大文件

我需要非常了解Java和内存问题的人的建议。我有一个大文件(大约1.5GB),我需要将此文件切成许多小文件(例如100个小文件)。

我通常知道如何做(使用BufferedReader),但是我想知道您是否对内存有任何建议,或者提示如何更快地进行操作。

我的文件包含文本,它不是二进制文件,每行大约有20个字符。

trans by 2019-10-26T10:23:46Z

c-free()是否设置errno?

如果malloc()malloc()分配的char缓冲区,则free()是否设置/重置errno

假设我想将缓冲区写入文件,然后释放它,因为我不再需要它。

假设代码的错误政策是针对错误返回-1。

这是写出缓冲区和进行错误检查而不泄漏内存的正确方法吗?

fputs(buf, somefile);
free(buf);
if (errno) return -1;

还是我需要考虑自由设置errno,如...

fputs(buf, somefile);
if (errno){ 
    free(buf);
    return -1;
}
free(buf);

或者,恐怖的恐怖,

do { 
  fputs(buf, somefile);
  int save_errno = errno;
  free(buf);
  errno = save_errno;
  if (errno) return -1;
} while(0);  

在需要重用的地方,使用块可以使本地save_errno存在于各个位置。

所有这些似乎都取决于free()是否设置errno。

free()的Linux手册页也是malloc()等的手册页。它提到malloc()设置errno,但没有提到free()

用于释放动态内存的GNU C库手册页没有提到free()是否设置errno。

因此,我编写了一个简短的程序来强制执行写错误,以便可以查看free()是否重置errno,但事实并非如此。 我想知道我是否应该依靠这个结果,以及free()如此重要以至于“当然它不会设置errno”这一事实。

# See if free() resets errno on a bad write
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
  char * buf = malloc(256);
  snprintf(buf,256,"%s\n", "Hello, World!");

  FILE *badfile;

  badfile = fopen("/dev/null","r");

  fputs(buf, badfile);
  free(buf);
  printf("%d\n", errno);
  printf("%s\n", strerror(errno));
}
trans by 2019-10-23T17:04:35Z

垃圾回收-如何监视Java内存使用情况?

我们在Jboss上运行了一个j2ee应用程序,我们想监视它的内存使用情况。 目前,我们使用以下代码

    System.gc();
    Runtime rt = Runtime.getRuntime();
    long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
    logger.information(this, "memory usage" + usedMB);

此代码可以正常工作。 这意味着它显示了与实际情况相对应的记忆曲线。 当我们从数据库创建一个大的xml文件时,曲线上升,提取完成后曲线下降。

alt text

一位顾问告诉我们,显式调用gc()是错误的,“让jvm决定何时运行gc”。 基本上,他的论点与此处讨论的论点相同。但是我还是不明白:

  • 如何获得内存使用曲线?
  • 显式gc()有什么问题? 我不在乎显式gc()可能发生的小性能问题,我估计会在1-3%的问题上发生。 我需要的是内存和线程监视器,它可以帮助我在客户现场分析系统。
trans by 2019-10-14T21:30:40Z

1 2 3 4 5 6 下一页 共6页