标签: dynamic-memory-allocation

如何在C中读取无限字符

如何在char*不指定大小的情况下将无限字符读入变量?

例如,假设我想要读取也可能需要多行的员工的地址.

c input realloc dynamic-memory-allocation

5
推荐指数
1
解决办法
5460
查看次数

Windows内存分配问题

我目前正在研究malloc()Windows下的实现.但在我的研究中,我偶然发现了困扰我的事情:

首先,我知道在API级别,windows主要使用HeapAlloc()VirtualAlloc()调用来分配内存.我从这里开始收集微软的实现malloc()(包含在CRT中 - C运行时)基本上要求HeapAlloc()块> 480字节,否则管理VirtualAlloc()为小分配分配的特殊区域,以防止碎片.

那一切都很好,很好.但是还有其他一些实现malloc(),例如nedmalloc,它声称比微软快了125%malloc.

所有这些让我想到了一些事情:

  1. 为什么我们不能只召唤HeapAlloc()小块?在碎片方面表现不佳(例如通过"先适合"而不是"最适合")?

    • 实际上,有没有办法知道各种API分配调用的内幕是什么?这将非常有帮助.
  2. 是什么nedmalloc比微软更快malloc

  3. 从上面的内容来看,我的印象是HeapAlloc()/ VirtualAlloc()速度太慢,以至于malloc()只是偶尔调用一次然后管理分配的内存本身要快得多.这个假设是真的吗?或者是malloc()因为碎片而需要的"包装"?有人会认为像这样的系统调用会很快 - 或者至少会有一些想法被放入其中以使它们有效.

    • 如果是真的,为什么会这样呢?
  4. 平均而言,典型malloc调用执行了多少(一个数量级)的内存读/写(可能是已分配段数的函数)?我会直观地说它是一个普通程序的十位,我是对的吗?

windows malloc memory-management dynamic-memory-allocation nedmalloc

5
推荐指数
1
解决办法
3702
查看次数

MemoryMappedFiles:可以为文件分配多少内存

我有较大的CT原始数据文件,最大可能超过20到30GB。对于该部门中当前的大多数计算机,我们最多只能使用3GB。但是对于处理数据,我们需要遍历所有可用数据。当然,我们可以通过依次通过读取和写入功能遍历数据来做到这一点。但是有时有必要将一些数据保留在内存中。

当前,我有自己的内存管理,在其中创建了一个所谓的MappableObject。每个原始数据文件都包含20000个结构,每个结构均显示不同的数据。每个MappableObject引用文件中的一个位置。

在C#中,我创建了某种程度上起作用的机制,该机制在必要时自动对数据进行mp和取消映射。从几年前我就知道MemoryMappedFiles,但是在.NET 3.5中,我拒绝使用它,因为我知道在.NET 4.0中,它可以在本地使用。

因此,今天我尝试了MemoryMappedFiles,发现不可能分配需要的内存。如果我有32位系统,而我想分配20GB,则由于超出逻辑地址空间的大小,因此无法使用。这对我来说很清楚。

但是,有没有办法处理像我这样的大文件?我还有其他机会吗?你们如何解决这些问题?

谢谢马丁

c# memory memory-management dynamic-memory-allocation

5
推荐指数
1
解决办法
3009
查看次数

两个数组声明方法c ++之间的区别

这些可能是在c ++中声明数组(并为它们分配内存)的两种方法中的两种

1. int a[3];

2. int *b = new int[3];
Run Code Online (Sandbox Code Playgroud)

我想了解c ++如何以不同的方式处理这两者.

一个.在这两种情况下,我都可以使用以下语法访问数组:a[1]b[1]

湾 当我尝试cout<< acout<< b,都打印相应数组的第一个元素的地址.

它看起来好像a和b都被视为指向数组的第一个元素的指针.

C.但奇怪的是,当我尝试这样做时cout << sizeof(a),sizeof(b)他们分别打印出不同的值 - 分别为4和12.

我不明白为什么在这种情况下sizeof(b),正在打印整个数组的大小.

c++ arrays pointers memory-management dynamic-memory-allocation

5
推荐指数
1
解决办法
1333
查看次数

使用相互依赖的维度分配动态数组

这有点复杂; 我欢迎任何关于如何提高问题清晰度的意见.

好吧,说我有一个数组:

real, allocatable :: A(:,:,:)
Run Code Online (Sandbox Code Playgroud)

我想在使用它之前分配它.第三维的大小是否可能取决于第二维的大小?

例如

do i=1,n
allocate(A(3,i,i**2))
end do
Run Code Online (Sandbox Code Playgroud)

显然以上都行不通.我想最终得到一个带有形状的数组(或一组数组)

(3,1,1), (3,2,4), (3,3,9), ... (3, n, n^2)
Run Code Online (Sandbox Code Playgroud)

其中第三维的大小是第二维的大小的平方.

我对依赖维度大小的规则有点复杂,但如果可以进行平方,我可以做其余的事情.

这可能吗?如果是这样,我如何在Fortran中实现它?

会有什么shape(A)回报?那会很有趣.

我的另一种选择是分配到所需的最大尺寸,并注意只在计算中使用某些元素,即

allocate(A(3,n,n**2))
Run Code Online (Sandbox Code Playgroud)

虽然我现在对记忆并不苛刻,但我希望有良好的编程习惯.无论如何,这是一个有趣的问题.

谢谢.

编辑:

如果维度的大小取决于另一维度中元素的

在下面的答案中,两个维度中数组的大小取决于B的索引.我想要的是某些东西

type myarray
    real :: coord(3)
    integer,allocatable :: lev(:)
    integer, allocatable :: cell(:)
endtype myarray

type(myarray), allocatable :: data

allocate(data(m))
allocate(data%lev(n))

forall (j=1:n) !simple now, for argument's sake
    lev(j)=j
endforall

! I was thinking of using a FORALL loop here, but the errors returned …
Run Code Online (Sandbox Code Playgroud)

fortran multidimensional-array dynamic-memory-allocation

5
推荐指数
1
解决办法
2817
查看次数

'c'问题中的动态内存分配

我正在使用malloc编写代码然后遇到问题所以我写了一个测试代码,它实际上总结了下面的整个混乱::

# include <stdio.h>
# include <stdlib.h>
# include <error.h>

int main()     
{
     int *p = NULL;
     void *t = NULL;
     unsigned short *d = NULL;

     t = malloc(2);
     if(t == NULL) perror("\n ERROR:");
     printf("\nSHORT:%d\n",sizeof(short));
     d =t;
     (*d) = 65536;
     p = t; 
     *p = 65536;
     printf("\nP:%p: D:%p:\n",p,d);
     printf("\nVAL_P:%d ## VAL_D:%d\n",(*p),(*d));
     return 0;
  }
   Output:: abhi@ubuntu:~/Desktop/ad/A1/CC$ ./test

            SHORT:2
            P:0x9512008: D:0x9512008:
            VAL_P:65536 ## VAL_D:0
Run Code Online (Sandbox Code Playgroud)

我使用malloc 分配2个字节的内存.返回void*指针的 Malloc 存储在void*指针't'中.

然后在那之后指出2个指针p - 整数类型和d - 短类型.然后我将t分配给它们*(p = …

c malloc dynamic-memory-allocation

5
推荐指数
1
解决办法
575
查看次数

有什么方法可以使用Qt而不为所有内容使用动态内存?

因此,我想我已经在网络上进行了彻底的搜索,发现没有什么真正有用的(最多只是令人困惑……)。

我想知道如何(如果可能)将Qt与非动态内存配合使用。我面临的问题是,对于许多小部件,我确切地知道我想要使用什么(这些子小部件,这些布局,固定数量等)。但是,当您不使用动态内存时,Qt中的所有内容似乎都会受到影响。一个简单的示例是QLayout,它来自Qt文档,旨在对所添加内容的所有权。所以基本上,下面的代码:

//In header
class ThumbnailDialog : public QDialog
{
    Q_OBJECT
public:
    ThumbnailDialog(QWidget* parent = 0);
    ~ThumbnailDialog(void);
private:
    QPushButton m_confirm;
    QPushButton m_cancel;

    QHBoxLayout m_buttonsLayout;
};

//Implementation of ctor
ThumbnailDialog::ThumbnailDialog(QWidget* parent):
    QDialog(parent)
{
     //...
     m_buttonsLayout.addWidget(&m_confirm);
     m_buttonsLayout.addWidget(&m_cancel);
     //...
     setLayout(&m_dialogLayout);
}
Run Code Online (Sandbox Code Playgroud)

...将最终(在MSVC上)导致调试断言失败,_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)因为在ThumbnailDialogdtor中,布局试图删除按钮...显然不应该这样做。

因此,像“ Qt Expert”所提倡的那样,我是否被迫在所有地方都使用动态记忆(虽然提到了“堆”……)?这似乎是错误的,因为这阻止了RAII的使用(如果父子关系意味着将进行删除,那么我不能使用智能指针来执行此操作)。对于编译时已知的内容,诉诸动态内存也感觉非常错误……(但是我可能是错的,这只是我的感觉)。

所以:有没有一种方法可以使用Qt而不new为每个小部件/布局使用动态内存和s?

c++ qt dynamic-memory-allocation

5
推荐指数
1
解决办法
1147
查看次数

如果在C中将分配的内存设置为NULL,会发生什么

在分配指针之前和之后将指针设置为NULL之间有区别吗?

例如,两者之间是否有任何区别

char* c = NULL;
Run Code Online (Sandbox Code Playgroud)

char* c = malloc(sizeof(char));
c = NULL;
Run Code Online (Sandbox Code Playgroud)

每个陈述的含义是什么(如果有的话),并且free(c)在每种情况下的召唤有什么不同?

c malloc free null dynamic-memory-allocation

5
推荐指数
2
解决办法
6262
查看次数

由malloc()`分配的内存有哪些内容?

malloc()用于分配内存空间之后,我很好奇指针究竟是什么?该联机帮助页告诉我calloc()初始化已分配的内存空间为零.

malloc()函数分配大小字节并返回指向已分配内存的指针. 内存未初始化.如果size为0,则malloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.

calloc()函数为每个大小为字节的nmemb元素数组分配内存,并返回指向已分配内存的指针. 内存设置为零.如果nmemb或size为0,则calloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.

我在C中为C(haha)创建了一个非常简短的示例程序:

int main() {
    char *dynamic_chars;
    unsigned amount;
    printf("how much bytes you want to allocate?\n");
    scanf("%d", &amount);

    dynamic_chars = (char*)malloc(amount*sizeof(char));
    printf("allocated:\n%s\n", dynamic_chars);

    free(dynamic_chars);
    return 0;
Run Code Online (Sandbox Code Playgroud)

}

但是,在执行此代码时,它只输出任何内容.如果我初始化内存,例如0xFFFF使用循环初始化每个字节,那么程序会向我显示我期望的内容.内存空间实际存在,因为我不会收到错误声称我正在尝试访问未初始化的变量.

由于内存空间通常不会被删除但被标记为可重写,我想知道如果通过执行我的程序,我是否应该能够看到以前使用的随机内存字节?但我什么都看不到,所以我真的很困惑malloc().

EDIT1

关于malloc()或者可能是内存使用的另一件事,关于我的程序是有趣的:如果我使用calloc(),分配内存,我可以通过例如监视来跟踪我的程序的实际内存使用情况.例如,如果我告诉我的程序,每次分配1.000.000.000字节的内存calloc()我将在我的系统监视器中看到以下内容: 使用<code>malloc()</code>,我什么也看不见.我明白,只是通过分配内存,我当时并没有真正使用它,但我仍然感到困惑的是为什么我的操作系统(unix衍生物)不会将其识别为使用它.因为<code>malloc()</code>就像<code>calloc()</code>将物理地址返回到我没有得到的内存位置一样,这个内存区域似乎实际上并没有被操作系统保留.那么我可以在系统监视器中看到它吗?如果我想将此作为一个新问题发布,请告诉我.但我认为,因为问题仍然是关于<code>malloc()</code>它如何适应这里.</p> </div>
        <p>
          <a href=c malloc initialization dynamic-memory-allocation

5
推荐指数
1
解决办法
1814
查看次数

在C ++中用std :: allocator :: allocate(0)分配零个对象

new int[0]在C ++中是允许的,但是std::allocator<int>().allocate(0)定义明确?更笼统地说,所有分配器都必须接受0作为分配参数吗?

编辑:阅读我测试了Visual Studio的答案后std::allocatorallocate(0)nullptr

deallocate(nullptr, anything) 是点头。

因此,使用nullptr是一个很好的建议,但是标准不要求deallocate(nullptr, 0)是nop,请参见是否允许使用C ++ allocator :: deallocate(NULL,1)?

c++ memory-management allocator dynamic-memory-allocation language-lawyer

5
推荐指数
1
解决办法
127
查看次数