Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251

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

30.04.2025, 10:20. Показов 9884. Ответов 19
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Я попытался написать свой аллоктор памяти (первый раз в жизни). Конечно он работает не так как ожидалось, поэтому появился примерно 1 миллион вопросов.
Собственно вот мой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#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;
}
и файл аллоктора

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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; то сразу вылетает ошибка
Code
1
2
3
4
5
6
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.
не до конца понятно, что это значит.

В целом, я пытаюсь написать некое подобие линейного аллоктора (не копирую чужой код и не подсматриваю в гугл, ну просто чтобы понять как это делать).
Но видимо у меня еще и ошибка в логике самого алгоритма.
Буду признателен за любые советы.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.04.2025, 10:20
Ответы с готовыми решениями:

Ошибка Fatal glibc error: malloc.c:2599
При компиляции ошибок нет. При запуске в середине программы ошибка. Fatal glibc error:...

Аллокатор malloc, как избавиться от CRT
Вот рабочий код HANDLE hFile = CreateFile(&quot;temp.txt&quot;, GENERIC_READ, FILE_SHARE_READ, NULL,...

Ошибка Assertion failure
что за ошибка

19
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
30.04.2025, 13:07
Цитата Сообщение от Anton1978 Посмотреть сообщение
1) вот тут строчка inline static long pos {}; , если сделать её просто long pos {}; , то она не будет прирастать тут pos++ , непонятно почему
static members
A static data member may be declared inline. An inline static data member can be defined in the class definition and may specify an initializer. It does not need an out-of-class definition:
Аллокатор ваш кто-то другой посмотрит.
Вам лучше писать с нуля чем брать чужой говнокод. Больше пользы и понимание будет, в итоге и опыта.


Посмотрел.
Цитата Сообщение от Anton1978 Посмотреть сообщение
C++
1
T* ret = static_cast<T*>(::new(&chanck + (sizeof(T) * pos)) T());
Зачем вы берете указатель у указателя, вашего буфера chanck???

Добавлено через 14 минут
Но это ещё не всё.
Цитата Сообщение от Anton1978 Посмотреть сообщение
_alloc->drop();
Ладно вы забили болт на вызов деструктора... для вашего плоского объекта...
Но вектор с указателями очищать то нужно, в вечном цикле...
0
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
30.04.2025, 13:08  [ТС]
это мой говнокод, я его сам придумал.
но поскольку это первая в моей жизни попытка написать аллокатор, то что вышло то вышло.

Зачем вы берете указатель у указателя, вашего буфера chanck???
ТОЧНО!!!!!
ой, нет тут всё верно - вроде

Ладно вы забили болт на вызов delete... для вашего плоского объекта...
Но вектор с указателями очищать то нужно, в вечном цикле...

А зачем delete? для "аллокатора" ?

Очистил вектор и вроде поперло, но еще поэсперементирую.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
30.04.2025, 13:20
Цитата Сообщение от Anton1978 Посмотреть сообщение
А зачем delete? для "аллокатора" ?
Вы объект создали? Создали.
Конструктор для него был вызван? Был.
А деструктор был вызван?

Кто будет его внутренние ресурсы освобождать?

Добавлено через 1 минуту
p.s. я поправил, не delete, а именно нужен вызов деструктора, что и делает delete.
Но ваш аллокатор сказал -: "не моё это царское дело, заборы красить".
А чьё?

Добавлено через 4 минуты
Просто вы делаете всё тяп ляп. Нет целостности, поэтому у вас будет много логически ошибок.
В программировании нужен порядок.
И зачем перегружать new delete для какого то класса что бы потестить аллокатор?
0
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
30.04.2025, 13:31  [ТС]
опытным путем установил что если в строке const long ALL = 400; поставить значение более 483 - происходит ошибка
Code
1
2
3
4
13:28:37: Starting /home/vabela/build-Test09-Desktop-Debug/Test09...
160000 8 0
free(): invalid pointer
13:28:37: /home/vabela/build-Test09-Desktop-Debug/Test09 crashed.
что она означает ?

Добавлено через 2 минуты
Просто вы делаете всё тяп ляп. Нет целостности, поэтому у вас будет много логически ошибок.
В программировании нужен порядок.
И зачем перегружать new delete для какого то класса что бы потестить аллокатор?

не тяп ляп, а первый раз - не до конца понимая происходящее. И да - чтобы потеснить код, проверить что будет - а если?

Кто будет его внутренние ресурсы освобождать?
я думал что смысл как раз в том, чтобы не освобождать их. Память выделена, и пишем в неё то что есть. Это не так ?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
30.04.2025, 13:51
Цитата Сообщение от Anton1978 Посмотреть сообщение
я думал что смысл как раз в том, чтобы не освобождать их. Память выделена, и пишем в неё то что есть. Это не так ?
Где то они должны освобождаться.
Например там где вы делаете new для ass_i. В main().
Почему нет delete?
В самом аллокатере так же есть new для chanck и нет delete.
Вот эти моменты и есть тяп-ляп.

Цитата Сообщение от Anton1978 Посмотреть сообщение
думал что смысл как раз в том, чтобы не освобождать их.
Смысл аллокаторов именно в том, что бы созданием и освобождением занимался именно аллокатор, а не тот кто его использует.

Вот вкратце про std::allocator :
Member functions associated with std::allocator() :

address: It is used for obtaining the address of an object although it is removed in C++20.
construct: It is used to construct an object.It is also removed in C++20.
destroy: It is used to destruct an object in allocated storage.It is also removed in C++20.
max_size: It returns the largest supported allocation size.It is deprecated in C++17 and removed in C++20.
allocate: Used for allocation of memory.
deallocate: Used for deallocation of memory.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// C++ program for illustration
// of std::allocator() function
#include <iostream>
#include <memory>
using namespace std;
int main()
{
 
    // allocator for integer values
    allocator<int> myAllocator;
 
    // allocate space for five ints
    int* arr = myAllocator.allocate(5);
 
    // construct arr[0] and arr[3]
    // myAllocator.construct(arr, 100); // no longer allowed in C++20
    arr[0] = 100; // do this instead
    arr[3] = 10;
 
    cout << arr[3] << endl;
    cout << arr[0] << endl;
 
    // deallocate space for five ints
    myAllocator.deallocate(arr, 5);
 
    return 0;
}
Добавлено через 2 минуты
А, вот, пример использования аллокатора.
Зачем вы сходу себе всё усложнили с пользовательским оператором new delete ?
0
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
30.04.2025, 14:09  [ТС]
Зачем вы сходу себе всё усложнили с пользовательским оператором new delete ?

Просто я был уверен, что это именно так должно работать. Нормальной информации по аллокаторам нет, исследую методом научного тыка.
К тому же, подозреваю я не верно понял концепцию аллокаторов. Вначале я сделал что-то в духе:

C++
1
2
3
4
5
    //main
    void* alloc = new char[1024];
    ass_i *a1 = ::new(&alloc) ass_i();
    ass_i *a2 = ::new(&alloc + sizeof(ass_i) ) ass_i();
    ass_i *a3 = ::new(&alloc + sizeof(ass_i) + sizeof(ass_i) ) ass_i();
Ок - это работает. Далее мне подумалось, а что если создать класс который будет делать вот такой кусок выделенной памяти для моих объектов. Окей, сделал, но кода уже нет (затер), он похож на текущий ''аллокатор".
И тут мне подумалось, а может это и есть аллокторы, понять которые я пытаюсь уже неделю?
Но просто надо сделать запись в нужную позицию void* alloc автоматическим и вот что вышло.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
30.04.2025, 14:44
Цитата Сообщение от Anton1978 Посмотреть сообщение
Нормальной информации по аллокторам нет
Первые гуглята:
Аллокаторы памяти(хабра)
Базовые концепции аллокаторов(хабра)
Качество и актуальность не проверял.

"Roy Patrice / Рой Патрис - C++ Memory Management / Управление памятью на C++ [2025]"
Аллокаторы рассматриваются аж в разделе 14. Writing Generic Containers with Allocator Support.
Это я к тому, что до них вы так же должны хорошо понимать механизмы работы с памятью.
Разницу между new, placement new, malloc и calloc. И так далее.
0
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
30.04.2025, 14:54  [ТС]
эти ссылки я читал, они бесполезны
а книга... короче я учил суахили, а не английский
есть несколько видео на ютубе, но там для тех кто уже всё понял
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
30.04.2025, 15:30
Цитата Сообщение от Anton1978 Посмотреть сообщение
а не английский
тяжко будет тогда, передовая информация на английском вся, по определенным причинам.
ну хотя бы студируйте cppreference.
Начиная с
Цитата Сообщение от SmallEvil Посмотреть сообщение
Разницу между new, placement new, malloc и calloc.
и по типам данных и какие они бывают, встроенные, POD, и характеристики типов <char_traits>

Мои полномочия всё.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
30.04.2025, 23:44
Цитата Сообщение от Anton1978 Посмотреть сообщение
а книга...
Можно далеко не лазить, ведь по аллокаторам есть целая глава в книге "Стандартная библиотека C++. Справочное руководство [2-е издание]", которую я рекомендовал здесь: Литература C++
Конкретную (и более сложную) реализацию аллокатора можно также найти в книге Александреску "Современное проектирование на C++".

Цитата Сообщение от Anton1978 Посмотреть сообщение
исследую методом научного тыка.
В C++ этот метод плохо работает, т.к. может создать иллюзию того, что у вас что-то получилось (компилябельность и работопособность кода в конкретном случае не означают его правильность).
1
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
01.05.2025, 11:29
Использование в плюсах линейного аллокатора для классов и шаблонов это плохая идея. Весь смысл линейного аллокатора в том что он используется тогда когда вам надо для какого либо расчёта дохрена мелких выделений памяти и после окончания расчёта вы просто говорите что всех этих выделений памяти не существовало. Соответственно никаких вызовов деструкторов не будет.
Поэтому шаблонные классы которые в будущем захотят выделять какие то ресурсы не освободят их.

Почитайте импортные статьи про аллокаторы и как их использовать.

Все Кастомные аллокаторы это очень мощная штука но надо учить алгоритмы и выключить ООП головного мозга.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.05.2025, 13:46
Цитата Сообщение от Aledveu Посмотреть сообщение
Почитайте импортные статьи
Цитата Сообщение от Anton1978 Посмотреть сообщение
короче я учил суахили, а не английский
---
Цитата Сообщение от Aledveu Посмотреть сообщение
и выключить ООП головного мозга.
И чем ООП мешает? Не вижу никакой связи.
Скорее это совет от того кто в него не умеет.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
02.05.2025, 04:42
Anton1978, для типов с тривиальным уничтожением:
с++20 (concepts)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <memory>
#include <type_traits>
#include <stdexcept>
#include <string>
 
template<class T>
concept TriviallyDestructible = std::is_trivially_destructible<T>::value;
 
template<class T>
   requires TriviallyDestructible<T>
class LinearAllocator{
public:
   explicit LinearAllocator(std::size_t elems) 
      :  capacity{elems}, 
         chunk{new char[sizeof(T)*elems]},
         p{(T*)chunk.get()},
         e{p + capacity}
   {}
   
   T* get(){
      if (p == e)
         throw std::length_error("LinearAllocator: limit reached");
      return ::new (p++) T{};
   }
   template<class... Args>
   T* get(Args... args){
      if ( p == e)
         throw std::length_error("LinearAllocator: limit reached");
      return ::new (p++) T{args...};
   }
   void clear(){
      p = (T*)chunk.get();
   }
private:
   const std::size_t capacity;
   std::unique_ptr<char[]> chunk;
   T *p, *e;
};
 
struct Item{
   int i;
   double d;
};
 
int main(){
   // LinearAllocator<std::string> LA_String(100); // compile error
   LinearAllocator<Item> items_allocator(100ULL);
   unsigned c = 100;
   while(c--){
      items_allocator.get();
   }
   
   // takes 101-th element
   try{
      items_allocator.get();
   }
   catch(const std::exception& e){
      std::cout << e.what() << std::endl;
   }
   
   items_allocator.clear();
   
   // try again
   c = 10;
   int i = 1;
   double d = 1.1;
   while(c--){
      auto p = items_allocator.get(i++, d*=2);
      std::cout << p->i << ' ' << p->d << std::endl;
   }
}
И никаких деалокаций. Похоже?
Просто выдалась минутка.

Добавлено через 4 минуты
Но я не уловил что это и для чего.

Добавлено через 5 часов 51 минуту
DrOffset, пожалуйста, прокомментируйте мне этот фрагмент моего кода поста #15.
Цитата Сообщение от SmallEvil Посмотреть сообщение
C++
16
chunk{new char[sizeof(T)*elems]}
Как я понимаю, нужно указать выравнивание для буфера?
C++
1
chunk{new (std::align_val_t(alignof(T))) char[sizeof(T)*elems]}
И так же освобождать?

Но я не понимаю сакрального смысла указания выравнивания для куска памяти.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
02.05.2025, 12:38
Цитата Сообщение от SmallEvil Посмотреть сообщение
Как я понимаю, нужно указать выравнивание для буфера?
Весь буфер выравнивать нет смысла. Выровнены должны быть конкретные отдаваемые аллокатором участки.
То есть вот этот указатель, который передается в placement new, должен быть выровнен в соответствии с T.
Цитата Сообщение от SmallEvil Посмотреть сообщение
return ::new (p++) T{};
Добавлено через 7 минут
В то же время, если T всегда один и тот же, то это выравнивание остальных адресов получится само собой. Но тогда стартовый адрес для участков должен быть выровнен. Тут есть нюанс, что аллокаторы общего назначения сейчас и так отдают уже максимально выровненые адреса для заданной платформы, потому что на их стороне обычно неизвестно какой именно тип будет размещен по этому адресу.
C++
1
2
void* p = std::malloc(something);
// p уже максимально выровнен, потому что на этом этапе неизвестно для чего этот p будет применяться
Добавлено через 57 секунд
Но это все, конечно, умолчания конкретной платформы.

Добавлено через 3 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
C++
1
chunk{new char[sizeof(T)*elems]},
В общем, короче говоря, чтобы избежать сюрпризов, я бы заменил это выделение памяти на std::malloc() или ::operator new(), чтобы конкретный тип не фигурировал вообще. И (по крайней мере я не знаю платформ, где было бы не так) вы будете получать выровненные адреса по умолчанию для данной платформы.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
02.05.2025, 16:28
Цитата Сообщение от DrOffset Посмотреть сообщение
чтобы избежать сюрпризов, я бы заменил это выделение памяти на std::malloc() или ::operator new()
В случае с unique_ptr нужен свой deleter при использовании operator new?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
02.05.2025, 22:18
Цитата Сообщение от SmallEvil Посмотреть сообщение
В случае с unique_ptr нужен свой deleter при использовании operator new?
Да.
0
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
06.05.2025, 10:57  [ТС]
Нашел позавчера видео где ведущий делает аллокатор, в прямом эфире.
Вот его код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <limits>
#include <memory>
#include <vector>
 
template<class T>
class TrackingAllocator
{
public:
    using value_type = T;
 
    using pointer = T *;
    using const_pointer = const T *;
 
    using size_type = size_t;
 
    TrackingAllocator() = default;
 
    template<class U>
    TrackingAllocator(const TrackingAllocator<U> &other) {}
 
    ~TrackingAllocator() = default;
 
    pointer allocate(size_type numObjects)
    {
        mAllocations += numObjects;
        return static_cast<pointer>(operator new(sizeof(T) * numObjects));
    }
 
    void deallocate(pointer p, size_type numObjects)
    {
        operator delete(p);
    }
 
    size_type get_allocations() const
    {
        return mAllocations;
    }
 
private:
    static size_type mAllocations;
};
 
template<class T>
typename TrackingAllocator<T>::size_type TrackingAllocator<T>::mAllocations = 0;
 
int main()
{
    std::vector<int, TrackingAllocator<int>> v(5);
    std::cout << v.get_allocator().get_allocations() << std::endl;
 
    return 0;
}
Это работает, хотя и не даёт прироста производительности, но я не понял момента -
C++
1
2
3
4
5
    pointer allocate(size_type numObjects)
    {
        mAllocations += numObjects;
        return static_cast<pointer>(operator new(sizeof(T) * numObjects));
    }
Он где память выделяет? поверх старого обьекта что ли ?
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
06.05.2025, 11:10
ну так это аллокатор, который просто поверх обычного new но только подсчитывает обший объём выделенной памяти - для статистики.

написано просто как пример - его использование в таком виде бесполезно.
1
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
06.05.2025, 13:06  [ТС]
а еще совсем непонятный момент, что передаётся в T* allocate(std::size_t num)
руководство утверждает, что это - Количество элементов, для которых необходимо выделить достаточный объем памяти.
Но если написать вот такой аллокатор
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template <typename T>
class MyAlloc
{
public:
    typedef T value_type;
    char *aloc = new char[10000000 * sizeof(T)];
 
    MyAlloc()
    {
        std::cout << "size is " << 10000000 * sizeof(T) << std::endl;
    }
 
    T* allocate(std::size_t num)
    {
        //return static_cast<T*>(::operator new(num*sizeof(T)));
        std::cout << "alloc num " << num << std::endl;
        return static_cast<T*>(::operator new(num*sizeof(T)));
    }
 
    void deallocate(T* p, std::size_t num)
    {
       //delete (p);
    }
};
и подставить его в мой предыдущий код, то получим такой вывод
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
11:57:16: Starting /home/vabela/QtProjects/build-Test08-Desktop-Debug/Test08...
size is 80000000
alloc num 1
alloc num 2
alloc num 4
alloc num 8
alloc num 16
alloc num 32
alloc num 64
alloc num 128
alloc num 256
alloc num 512
alloc num 1024
alloc num 2048
alloc num 4096
alloc num 8192
alloc num 16384
alloc num 32768
alloc num 65536
alloc num 131072
alloc num 262144
alloc num 524288
alloc num 1048576
alloc num 2097152
alloc num 4194304
alloc num 8388608
alloc num 16777216
350.208
alloc num 33554432
346.036
87.2675
alloc num 67108864
675.906
86.5304
87.1573
alloc num 134217728
1155.96
97.7803
98.0215
Это что за величины такие ?

Добавлено через 58 минут
до меня дошло, это из-за тестирования , я делаю вот такую проверку аллокатора
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
    const long SIZE_X = 1000;
    std::array<std::byte,SIZE_X> *adata = new std::array<std::byte,SIZE_X>();
    std::pmr::monotonic_buffer_resource memoryPool{adata->data(),adata->size()};
    //std::pmr::vector<long> _vec{&memoryPool};
 
    std::vector<long, MyAlloc<long>> _vec{};
 
    while(true)
    {
        Timer *t = new Timer();
        for (long z=0;z<SIZE_X;z++)
        {
            _vec.push_back(z);
        }
        t->~Timer();
 
    }
 
    return 0;
}
и каждый раз я добавляю в вектор величину увеличивая его размер и каждый раз вектор копируется в новую область памяти, чтобы добавить себе новый элемент. От того и такие огромные выделения - это величина вектора целиком, но кто бы мог подумать, что это вот так сработает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2025, 13:06
Помогаю со студенческими работами здесь

Ошибка "string subscript out of range" (debug assertion failure)
Добрый день! Есть простая функция типа string, которая берёт на вход произвольную С-строку (char...

[Linker Fatal Error] Fatal: Could not open ~CBuilder6\Projects\Project1.exe (error code 5)
Инсталировал с++ builder 6. Запустил програму и попробывал компилировать пустую форму, чтобы...

Ошибка 1>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
Два компа. ОС Windows XP. VC++ Express 2010. Настройки по умолчанию. На одном всё нормально. На...

Debug assertion failure
Здравствуйте: Программа: класс server: создаёт потоки. в которых консьюмер и продюсер работают...

LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru