- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 c++ 程序在具有 12GB 内存的 Windows 7 机器上运行。编译器和链接器是 Visual Studio 2013 Express。
该程序使用 OGDF 库。我将库源代码编译成具有 Release X64 配置的静态库,并在我的项目中引用了该库。
当我运行问题(调试 x64 配置)时,OGDF 库中的代码抛出异常,指示没有足够的可用内存;
E *p = static_cast<E *>( realloc(m_pStart, sNew*sizeof(E)) );
if(p == 0) OGDF_THROW(InsufficientMemoryException);
我暂停程序并打开调试窗口并检查了 sNew = 9M 和 sizeof(E) = 8 的值,因此分配了 72M 内存但失败了。
在调试时我打开了windows任务管理器,它显示我程序的内存使用(工作集大小和提交大小)小于2MB
所以我很困惑为什么 REALLOC 会失败,因为有足够的可用内存(>4GB)?即使我的堆中有很多碎片,提交的大小也小于 2MB,因此应该有足够的内存。
为了测试建议,我在调用库函数之前插入了以下代码:
void* ddd = malloc(1200000000);
char* b = (char*)ddd;
char ttt = 3;
int g = 0;
for (g = 0; g < 1200000000;++g)
{
*(b + g) = ttt;
}
ddd=realloc(ddd, 2400000000);
b = (char*)ddd;
for (g = 0; g < 2400000000; ++g)
{
*(b + g) = ttt;
}
上面的代码运行正常(调试 x64 配置)并且任务管理器显示我的内存使用量(工作集和提交大小)在我调用 free() 之前约为 2.3GB。所以在我的程序中我可以在我的堆上分配超过 2GB 的内存,为什么库代码中的 72MB 分配失败?
编辑:
我发现了问题。
当我使用发布配置编译的库文件时,调试器向我显示了错误的局部变量数据。实际原因是库正在调用 realloc(ptr,0)。
最佳答案
您的问题非常类似于“您为什么不给我开张 500 美元的支票?您银行里有 2,000 美元。”
操作系统在使用内存之前收到内存请求。操作系统无法批准内存分配请求,除非它有足够的后备存储来满足它已经允许的所有请求,无论它们当前是否正在使用任何 RAM。
例如,如果您malloc
1GB 但尚未访问分配的虚拟地址空间,则该分配将使用远少于 1GB 的 RAM。但在该分配被释放之前,系统必须保留 1GB 的后备存储(RAM 或交换),以防您的程序开始使用该分配的空间。
如果系统有太多这样的分配,即使它有足够的空闲 RAM,它也会拒绝新的分配。 Windows 不会过度使用,因为如果这些映射稍后需要比操作系统更多的后备存储,则存在强制终止应用程序的风险。
避免将来出现这些误解的一个好方法是避免单独使用“内存”这个词。如果您指的是 RAM,请说“RAM”或“物理内存”。如果您指的是后备存储,请说“后备存储”。如果您指的是地址空间,请说“虚拟内存”。
你说这样的话,“我有很多空闲内存,所以我应该可以分配内存。”这听起来像是一个谜。但是,如果您更准确地说,“我有很多空闲 RAM,为什么我不能分配更多虚拟内存(或后备内存)?”,您就已经回答了一半。
关于c++ - 当内存可用时,realloc() 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33912861/
如果 realloc 失败并返回 NULL 是前一个缓冲区被释放还是保持不变?我没有在手册页中找到那条特定的信息,我不确定该怎么做。如果内存被释放,那么双重释放可能会有风险。如果没有,就会发生泄漏。
OS: Linux CC: GCC 4.8.2 目标:改变 char* 的大小 -> 变小 问题:更改后的大小相同... 行是带有数据的字符串... 代码片段: char * tmp = NUL
在一个函数中我使用了 malloc : void name1(struct stos* s) { s = malloc (4 * sizeof (int)); } 一切正常。但是后来我用了rea
我知道有一个 realloc允许我调整内存块大小的函数(它与一个免费函数配对)。但是,我正在尝试对一些成员指针使用 new 而不是 realloc 分配内存的 c++ 类执行相同的操作。在 C++ 中
我正在尝试在 C 中创建一个动态整数数组,它应该在填满后自动将其大小加倍。 要扩展数组的大小,我想使用 realloc 函数。不幸的是,指向我的 DynamicArray 和 GCC 崩溃的数据的指针
这是我被教导使用的方式 realloc() : int *a = malloc(10); a = realloc(a, 100); // Why do we do "a = .... ?" if(a
我尝试在每个循环中使用 realloc(),因此我只为 C 中的 int 数组使用必要的内存,但输出值已更改。尽管如此,在我的代码中使用 Valgrind 时,我得到了正确的值。 我在做 Advent
平台:Linux 3.2.0 x86 (Debian Wheezy) 编译器:GCC 4.7.2 (Debian 4.7.2-5) 我想知道如果我尝试 realloc() 一个已递增的指针会发生什么。
我知道可以在内核中使用 malloc 在 GPU 的全局内存上分配内存。是否也可以使用realloc? 最佳答案 您可以为您的数据类型编写自己的 realloc 设备函数。 只需为新数组分配新空间,将
我在对数组使用 malloc/realloc 命令时遇到了一些问题。我创建了一个包含一些整数的小数组,并尝试通过使用 realloc 扩展大小并添加值来为其添加一个值,但是当我这样做时,0 索引的值不
背景: 我使用 calloc() 创建了一个数组,一切都运行良好。然后我使用 realloc() 使数组更大。它似乎只是创建一个没有任何内容的新指针,并在我尝试访问数组中的元素时调用运行时错误。 我的
假设我已经使用 malloc() 分配了内存,如果我在我的代码中这样做: char *newline = realloc ( oldline , newsize ); // Assuming oldl
我正在尝试在下面的程序中使用 realloc 重新分配内存,并在我使用 malloc(i = (int*)malloc(5 * sizeof(int))) 使用react的 realloc 初始内存之
为什么下面的代码输出两次 4,而不是 8 和 20?谢谢 int size = 0; int *pointer; pointer = malloc(2 * sizeof(int)); size = s
我正在尝试将一堆 WCHAR 添加到缓冲区。这个函数就是将它添加到我的缓冲区中的原因.. DWORD add_to_buffer(BYTE *databuffer, WCHAR *path, WCHA
可能我的大脑现在不能正常工作......我想知道为什么我在我的代码中收到提到的错误: int ** zm; zm = (int**)calloc(1, sizeof(int*)); *zm = (in
我正在尝试用 C 语言编写代码,但遇到了 realloc 的问题。该代码在某个时间点工作正常,但在另一时间重新分配期间因堆损坏错误而崩溃。我已将填充数据的结构和函数粘贴到其中。谁能告诉我我是否在这里做
realloc 会改变它的第一个参数吗? 改变第一个参数是否取决于实现? 有什么理由不应该是const吗?作为反例,memcpy 将其 src 参数设为 const。 ISO C 标准,第 7.20.
我在 realloc 中遇到此错误,该错误仅发生在我学校的实验室计算机上,而不发生在我的计算机上。 在此程序中,我将行号存储在 File_Node 结构中。 File_Node 是一个链表的一部分,每
来自 man realloc:realloc() 函数返回一个指向新分配的内存的指针,该指针适合任何类型的变量,可能与 ptr 不同,如果请求失败,则返回 NULL . 因此在此代码片段中: ptr
我是一名优秀的程序员,十分优秀!