标签: dynamic-memory-allocation

MPI_Abort 和动态分配的内存

我正在学习在 C 中使用 MPI 进行编程,但当其中一个进程调用 MPI_Abort 时,我没有设法从 MPI 通信器/组中的所有进程中找到动态分配的内存(malloc/calloc)会发生什么。

不释放动态分配的内存会导致故障/不可预测的行为?这是否被视为泄漏?

c mpi dynamic-memory-allocation

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

没有垃圾收集器的编程语言:垃圾去哪儿了?

我目前正在研究算法和高级数据结构:因为我熟悉 C 并且它确实在实现和指针使用之上提供了很好的控制水平,我正在使用它来测试到目前为止对主题的理解。

在测试需要动态事物(如列表和树)的结构时,我问自己:由于 C 没有垃圾收集器,如果我不调用 free() 函数来释放动态分配的所有变量,那在哪里记忆去?

其他相关问题包括(抱歉误用了一些术语,我在低级抽象方面没有太多经验):

  • 编译器是使用实际的硬盘驱动器资源(例如驱动器的 x 记录中的变量)还是“实例化”一部分虚拟内存来编译和运行我的程序?

  • 我的硬盘中是否有很多列表、树和图形,所有这些都涉及从 0 到 100 的计数或字符串“abcd”和“qwerty”?

  • 操作系统是否将所述数据识别为垃圾,或者在我格式化驱动器之前我一直被这些垃圾困住?

我真的很好奇,我从来没有低于 C 的抽象级别。

c garbage-collection dynamic-memory-allocation

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

如何处理外部碎片,分页如何帮助外部碎片?

我知道关于我在这里指出的问题有很多问题,但我找不到任何复杂的答案(无论是在 StackOverflow 上还是在其他来源中)。

我想问一下堆(RAM)碎片问题。

据我所知,有两种碎片: 内部- 与分配单元大小(AU)和分配内存大小 AM 之间的差异有关(浪费内存等于 AM % AU), 外部- 与空闲的非连续区域有关内存,所以即使空闲内存区域的总和可以处理新的分配请求,如果没有可以处理的继续区域,它也会失败。

这是很清楚的。当“分页”出现时,问题就开始了。

有时候能找到分页解决外部碎片问题的信息。事实上,我同意由于分页操作系统能够创建内存的虚拟连续区域,分配给进程,即使内存的部分在物理上是分散的。

但它究竟如何帮助外部碎片化? 我的意思是,假设一个页面的大小有 4kB,而我们想要分配 16kB,那么当然我们只需要找到四个空页面帧,即使这些帧在物理上不属于继续区域的一部分。

但是如果分配较小呢? 我相信页面本身仍然可能是碎片化的,并且(在最坏的情况下)如果旧框架不能用于分配请求的内存,操作系统仍然需要提供一个新框架。

那么(假设最坏的情况),无论是否有分页,分配和释放堆内存(不同大小)的长时间工作的应用程序迟早会因为外部碎片而陷入低内存状态吗?

那么问题来了,外部碎片怎么处理呢? 自己实现分配算法?分页(如我所写,不确定是否有帮助)?还有什么 ?操作系统(Windows、Linux)是否提供了一些碎片整理方法?

最彻底的解决方案是禁止使用堆,但是对于具有分页、虚拟地址空间、虚拟内存等的平台来说真的有必要吗……唯一的问题是应用程序需要不间断地运行一年?

还有一个问题……内部碎片化是一个含糊不清的术语吗? 我在某处发现了内部碎片指向页面框架部分的定义,这是浪费的,因为进程不需要更多内存,但单个框架不能由多个进程拥有。

我把问题加粗了,所以赶时间的人不用阅读所有内容也能找到问题。

问候!

paging memory-management fragmentation dynamic-memory-allocation memory-fragmentation

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

我可以删除以前动态分配但使用不同指针的内存吗?

我正在用 C++ 编写一个链表程序。为了实现这个概念,我在全局创建了一个指针“start”,指向列表的第一个元素。

程序完成后,我尝试通过使用 start 和另一个本地声明的指针“p”访问连续节点来删除动态分配的所有内存以防止内存泄漏。在这里,我使用了一个指向相同正确地址的指针,但这个指针不是用于内存分配的指针,而是像任何普通指针一样在本地声明。

我的问题是 - 是否可以使用指向同一位置的普通指针来删除动态分配的内存?

c++ pointers linked-list dynamic-memory-allocation delete-operator

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

C 中损坏的大小与 prev_size

每当我在线程中分配动态内存时,都会出现“大小损坏与 prev_size”错误。每当我在 main() 中分配内存时,它都可以正常工作。但是在线程中分配动态内存会产生错误。

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

void *fib(void *p);
struct mystruct
{
    int *array;
    int size;
};

int main(int argc, char *argv[])
{
    pthread_t tid;
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    struct mystruct obj;

    obj.size = atoi(argv[1]);;

    pthread_create(&tid, &attr, fib, (void *)&obj);
    pthread_join(tid, NULL);
}

void *fib (void *p)
{
    struct mystruct *x = (struct mystruct *)p;
    x->array = (int *) malloc (x->size);

    for (int i=0; i<x->size; i++){
        x->array[i] = i;
        printf("The array is = %d\n", x->array[i]);
    }   
} …
Run Code Online (Sandbox Code Playgroud)

c pthreads dynamic-memory-allocation

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

如何正确释放一组指针?

如果我有一个容器,比如std::set指向动态对象的指针,那么我如何释放它的元素?

int main()
{

    // new scope
    {
        int x = 10;
        std::set<int*> spi;
        spi.insert(new int(1));// elem is a dynamic object init from 1
        spi.insert(new int[3]()); // elem is a dynamic array of 3 default-init integers
        spi.insert(&x); // elem is address of stack memory object
    }
}
Run Code Online (Sandbox Code Playgroud)

那么如何有效地释放具有动态内存的元素呢?

  • 我知道我可以使用一组 shared_ptrs 或 unique_ptr 但为了练习,我想知道如何使用。

c++ dynamic-memory-allocation stdset

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

我是删除一个对象,还是只是它的指针

我正在实现我自己的队列版本以供练习,但想知道我是否在“pop()”函数中正确删除了元素。

我是 C++ 的新手,我不确定我是否只是删除指向我要删除的节点的指针,而不是实际节点本身。

#include <iostream>

template <typename T>
class Queue {
    struct Node {
        Node* next;
        Node* previous;
        T data;
        Node(T value){
            next = nullptr;
            previous = nullptr;
            data = value;
        }
    };

    Node* front;
    Node* back;

    public:
        Queue(){
            front = nullptr;
            back = nullptr;
        }

        void push_back(T data){
            Node* n = new Node(data);
            if(front == nullptr){
                front = n;
                back = n;
            } else {
                back->next = n;
                back = n;
            }
        }

        void print(){
            Node* cursor = …
Run Code Online (Sandbox Code Playgroud)

c++ dynamic-memory-allocation

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

malloc(sizeof(ptr)) 和 malloc(sizeof(ptr*)) 的区别?

我想知道这两行有什么区别:

 queue* f=(queue*)malloc(sizeof(queue));
Run Code Online (Sandbox Code Playgroud)
 queue* f=(queue*)malloc(sizeof(queue*));
Run Code Online (Sandbox Code Playgroud)

队列的定义如下:

typedef struct queue
{
    int arr[N];
    int tail;
}queue;
Run Code Online (Sandbox Code Playgroud)

提前致谢!

c pointers dynamic-memory-allocation

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

需要超过 16GB 的连续内存时,内存分配失败

我的工作站有 128GB 内存。我无法分配占用(连续)内存超过 ~16GB 的数组。但是我可以分配多个数组,每个数组大约需要 15GB。

示例代码:

#include <stdlib.h>
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
int MM = 1000000;
int NN = 2200; // 2000 is okay, used ~16GB memory; 2200 produces Segmentation fault

double* testMem1d;
testMem1d  = (double*) malloc(MM*NN*sizeof(double));

double* testMem1d1; // NN=2000, allocate another array (or two) at the same time is okay
testMem1d1 = (double*) malloc(MM*NN*sizeof(double));

cout << "testMem1d allocated" << endl;
cin.get(); // here is okay, only malloc but not accessing …
Run Code Online (Sandbox Code Playgroud)

c++ linux malloc dynamic-memory-allocation ubuntu-16.04

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

这是如何运作的?指向指针赋值的指针

#include <iostream>
using namespace std;
int main() {
    int *p1;
    p1 = new int;
    int *p2;
    p2 = new int;
    p2 = p1;    // what happens here?
    *p1=5;
    cout << "pointer 2 is " << *p2 << endl << *p1 << endl;  // both give out 5
    delete p1;  // what happens to p2 ?
    cout << "pointer 2 is " << *p2 << endl;
    delete p2;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我删除指针对象 p1 时会发生什么?什么是指针 p2 现在引用?有人能解释一下吗?谢谢您的帮助

c++ dynamic-memory-allocation

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