Quantcast
Channel: Форум программистов и сисадминов Киберфорум
Viewing all articles
Browse latest Browse all 518367

Аллокатор памяти, ошибка Fatal glibc error: malloc assertion failure in sysmalloc - C++

$
0
0
Добрый день.
Я попытался написать свой аллоктор памяти (первый раз в жизни). Конечно он работает не так как ожидалось, поэтому появился примерно 1 миллион вопросов.
Собственно вот мой код
:

#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <timer.h>
#include <linearallocator.h>

struct ass_i;

const long ALL = 400;
LinearAllocator<ass_i> *_alloc = new LinearAllocator<ass_i>(ALL);

struct ass_i
{
    int a{};
    double dub{};
    void *operator new(size_t v) noexcept
    {
        return _alloc->allocate(&v);//malloc(v);
    }

    void operator delete(void *v)
    {
        _alloc->deallocate(static_cast<ass_i*>(v),16);
    }
};

int main()
{
    std::vector<ass_i*> _vec{};
    while(true)
    {
        Timer t;
        for (long x = 0 ; x < ALL ; x++)
        {
            ass_i *a = new ass_i();
            a->a = x;
            _vec.push_back(std::move(a));
        }
        _alloc->drop();
    }

    return 0;
}

и файл аллоктора

:

#ifndef LINEARALLOCATOR_H
#define LINEARALLOCATOR_H

#include <cstdlib>
#include <iostream>
#include <ostream>

template <typename T>
class LinearAllocator
{
    void *chanck = nullptr;
    inline static long pos {};

public:
    using value_type = T;
    explicit LinearAllocator(long size)
    {
        chanck = new char[(sizeof(T) * size)];
        pos = 0;
        std::cout << (sizeof(T) * size) << " " << sizeof(chanck) << " " << pos << std::endl;
    }
    T* allocate(std::size_t *size)
    {
        T* ret = static_cast<T*>(::new(&chanck + (sizeof(T) * pos)) T());
        pos ++;
        //std::cout << "pos  " << pos << std::endl;
        return ret;
    }
    void deallocate(T* p,std::size_t)
    {
        delete p;
        //pos--;
    }
    void drop()
    {
        pos = 0;
    }

};

#endif // LINEARALLOCATOR_H

1) вот тут строчка inline static long pos {}; , если сделать её просто long pos {}; , то она не будет прирастать тут pos++ , непонятно почему
2) если поставить const long ALL = 400; то вроде как работает, а если const long ALL = 100; то сразу вылетает ошибка
:


10:18:14: Starting /home/vabela/build-Test09-Desktop-Debug/Test09...
1600 8 0
0.01369
0.00454
Fatal glibc error: malloc assertion failure in sysmalloc: (old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)
10:18:14: /home/vabela/build-Test09-Desktop-Debug/Test09 crashed.

не до конца понятно, что это значит.

В целом, я пытаюсь написать некое подобие линейного аллоктора (не копирую чужой код и не подсматриваю в гугл, ну просто чтобы понять как это делать).
Но видимо у меня еще и ошибка в логике самого алгоритма.
Буду признателен за любые советы.

Viewing all articles
Browse latest Browse all 518367

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>