我需要编写一个程序(最好使用高级语言,如 C# 或 Java,但可以是 C/C++),在任何情况下都不能将其数据写入磁盘。
即使不执行任何 I/O 操作,数据也可以通过 OS 页面错误写入磁盘。
有没有办法避免它?
在我的程序中,我处理大量数据。我使用 malloc() 函数为我的大数组分配内存。分配内存后,我检查指针是否为NULL(那是因为没有那么大的内存空间或者我不知道为什么)。
但有时我的指针是NULL。那么现在该怎么办呢?我做了一个循环,如果指针为空,它会尝试一次又一次地分配它。但它变成了无限循环,并且仍然说指针为 NULL。那么如果不想分配内存怎么分配呢?
谢谢你的回复。
我一直在使用 boost object_pool 一段时间,并且对结果总体上感到满意。以前我主要是分配单个对象,但很少单独释放它们,只是一次释放整个池。最近,当我遇到需要从池中释放许多对象时,我发现它非常慢。
显然 pool 正在搜索已发布的块列表以链接新发布的对象。该文档讨论了有序和无序池,并提到了 pool_allocator 和 fast_pool_allocator。无序池(使用 fast_memory_allocator)在释放内存块方面可能会快得多。但是,我看不到如何使用它。
我是否正确理解我只能在 pool_allocator 和 fast_pool_allocator 之间选择与 boost::singleton_pool 而不是 boost::object_pool ?
下面是一个说明问题的小测试程序。它是用 VS2013 和 boost 1_57_0 构建的。测试在对象池中分配 n 个对象,然后随机释放 10%。它有一些粗略的计时工具,表明对于 n == 100,000,分配需要 0.004 秒,而释放需要 0.4 秒。同时,对于 n == 1,000,000,在我的机器上分配需要 0.022 秒,释放需要 42 秒。
#include <boost/pool/object_pool.hpp>
#include "time.h"
#include <vector>
#include <random>
struct foo {
int data[10];
};
struct test {
test(unsigned n) : size{ n } {}
void run();
float elapsedSec(clock_t& watch);
unsigned size;
boost::object_pool<foo> _pool;
float mallocSec;
float freeSec; …Run Code Online (Sandbox Code Playgroud) 我创建了一个无法通过GC收集的内存分配库.(https://github.com/10sa/Unmanaged-Memory)
该库分配的堆区域基本上是通过使用WinAPI GetProcessHeap()函数获得的.您还可以创建堆区域并将其分配给它.但是,用于创建堆区域的函数是HeapCreate函数.
问题是,
1.此内存区域(GetProcessHeap())是否由GC管理?
2.如果使用HeapCreate函数创建新的堆区域,GC可以收集生成的堆区域吗?
3.如果上述所有问题都成立,如何在不使用Global Heap的情况下在C#中创建内存区域?
我知道原始值存储在堆栈中,非原始值存储在堆中。据我所知,堆栈还包含对非原始值的引用。现在我的疑问是我们在哪里存储对原语的引用?即,例如,
int a=10;
Run Code Online (Sandbox Code Playgroud)
现在据我所知,值 10 存储在堆栈中,但我的问题是该值a存储在哪里?
另外请推荐一些学习 Java 内存管理的好资源。我在网上读了很多东西,但没有一个对我来说是清楚的。
我正在研究 C 语言中的文件,我很好奇是否有必要在文件类型指针中使用该free()函数,如果没有,我想要一个解释。
FILE *p;
Run Code Online (Sandbox Code Playgroud)
既然p是一个指针,它不应该是免费的吗?
如何释放a char*后使用的所有内存不再有用?
我有一些 struct
struct information
{
/* code */
char * fileName;
}
Run Code Online (Sandbox Code Playgroud)
我显然要在其中保存一个文件名char*,但在使用一段时间之后,我想释放以前的内存,我该怎么做?
E:我并不是要释放指针,而是指向的空间fileName,这很可能是一个字符串文字.
我写了一个C程序如下:
void foo(int *a) {
if (a[1000] == a[1000]) {
printf("Hello");
}
}
int main() {
int *a;
foo(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期待这个程序崩溃,因为我没有在&a [1000]分配内存,但程序实际上没有崩溃并打印"Hello".我用命令编译了程序
gcc -O0 foo.c
Run Code Online (Sandbox Code Playgroud)
可能是什么原因?
c memory-management compiler-optimization undefined-behavior
下面的代码片段是故意访问下面的下一个sizeof(int)字节t[4],所以我知道这里犯的错误.我只是作为一个实验来看看编译器如何处理堆栈分配.
int t[5], i;
for (i = 0; i <= 5; i++) {
t[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)
在Windows上执行此代码时,使用GNU C编译器的移植版本,程序总是陷入无限循环.我确信这只会发生,因为t并且i在堆栈上依次分配并t[5]指向与i变量相同的地址.因此,当执行t[5] = 0程序时实际将值设置i为零.
但是,当使用不同版本的GNU C编译器编译它时,我永远不会得到无限循环.地址t[5]与地址不同i.
我的问题是,为什么这种行为不同?我知道你不应该假设这个结果,但是不是堆栈分配应该以同样的方式发生吗?
我真正好奇的是编译器如何管理这些堆栈分配.有填充物吗?订单总是与源代码中的相同吗?显然,这与C标准无关,实现之间存在差异,甚至同一编译器的不同版本也存在差异.我很好奇,尽管在这种特殊情况下可能的结果和考虑因素是什么.