标签: memory-management

具体内存分配 - C++

是否可以在特定地址分配内存?有没有一个函数可以解决这个问题呢?

c++ memory-management

-2
推荐指数
1
解决办法
643
查看次数

强制用户态程序在非分页内存下运行

我需要编写一个程序(最好使用高级语言,如 C# 或 Java,但可以是 C/C++),在任何情况下都不能将其数据写入磁盘。

即使不执行任何 I/O 操作,数据也可以通过 OS 页面错误写入磁盘。

有没有办法避免它?

c++ winapi operating-system memory-management process

-2
推荐指数
1
解决办法
434
查看次数

如果malloc返回NULL怎么办?

在我的程序中,我处理大量数据。我使用 malloc() 函数为我的大数组分配内存。分配内存后,我检查指针是否为NULL(那是因为没有那么大的内存空间或者我不知道为什么)。

但有时我的指针是NULL。那么现在该怎么办呢?我做了一个循环,如果指针为空,它会尝试一次又一次地分配它。但它变成了无限循环,并且仍然说指针为 NULL。那么如果不想分配内存怎么分配呢?

谢谢你的回复。

c pointers memory-management

-2
推荐指数
1
解决办法
4402
查看次数

有什么方法可以使用 boost::obect_pool 进行更快的免费操作

我一直在使用 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)

c++ boost memory-management

-2
推荐指数
1
解决办法
1521
查看次数

HeapAlloc,HeapCreate在C#中是垃圾收集的

我创建了一个无法通过GC收集的内存分配库.(https://github.com/10sa/Unmanaged-Memory)

该库分配的堆区域基本上是通过使用WinAPI GetProcessHeap()函数获得的.您还可以创建堆区域并将其分配给它.但是,用于创建堆区域的函数是HeapCreate函数.

问题是,

1.此内存区域(GetProcessHeap())是否由GC管理?

2.如果使用HeapCreate函数创建新的堆区域,GC可以收集生成的堆区域吗?

3.如果上述所有问题都成立,如何在不使用Global Heap的情况下在C#中创建内存区域?

c# heap winapi memory-management heap-memory

-2
推荐指数
1
解决办法
374
查看次数

java中对原始变量的引用存储在哪里?

我知道原始值存储在堆栈中,非原始值存储在堆中。据我所知,堆栈还包含对非原始值的引用。现在我的疑问是我们在哪里存储对原语的引用?即,例如,

int a=10;
Run Code Online (Sandbox Code Playgroud)

现在据我所知,值 10 存储在堆栈中,但我的问题是该值a存储在哪里?

另外请推荐一些学习 Java 内存管理的好资源。我在网上读了很多东西,但没有一个对我来说是清楚的。

java memory-management heap-memory stack-memory

-2
推荐指数
1
解决办法
329
查看次数

C语言处理文件时是否需要释放文件指针?

我正在研究 C 语言中的文件,我很好奇是否有必要在文件类型指针中使用该free()函数,如果没有,我想要一个解释。

    FILE *p;
Run Code Online (Sandbox Code Playgroud)

既然p是一个指针,它不应该是免费的吗?

c memory-management

-2
推荐指数
1
解决办法
102
查看次数

如何释放字符串文字所消耗的内存?

如何释放a char*后使用的所有内存不再有用?

我有一些 struct

struct information
{
/* code */
char * fileName;
}
Run Code Online (Sandbox Code Playgroud)

我显然要在其中保存一个文件名char*,但在使用一段时间之后,我想释放以前的内存,我该怎么做?

E:我并不是要释放指针,而是指向的空间fileName,这很可能是一个字符串文字.

c memory-management string-literals

-3
推荐指数
1
解决办法
373
查看次数

内存读取没有malloc

我写了一个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

-3
推荐指数
2
解决办法
341
查看次数

关于C中堆栈分配的问题

下面的代码片段是故意访问下面的下一个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标准无关,实现之间存在差异,甚至同一编译器的不同版本也存在差异.我很好奇,尽管在这种特殊情况下可能的结果和考虑因素是什么.

c stack memory-management

-3
推荐指数
1
解决办法
197
查看次数