STL на собственной ОС - std :: list работает, а std :: vector - нет - PullRequest
4 голосов
/ 18 августа 2010

Я просто играю с загрузочным ядром C ++ в Visual Studio 2010.

Я дошел до того, что у меня есть новые и удаленные записи, и такие вещи, как динамически размещаемые массивы, работают. Я могу использовать списки STL, например. Я даже могу отсортировать их после того, как написал подпрограмму memcpy. Проблема в том, когда я использую тип std :: vector. Простое построение вектора отправляет ядро ​​в землю.

Очевидно, что мне не хватает какой-то реализации функции, но я просмотрел STL в поисках и пришел с пустыми руками. Сбой при push_back:

vector<int> v;
v.push_back(1);

и исчезает в эфире.

Есть какие-нибудь предположения о том, что мне не хватает?

Редактировать Да, это вектор из int. Извините за путаницу. Не только это, но это не тот конструктор, на котором он отказывает, это вызов push_back.

Ответы [ 3 ]

6 голосов
/ 18 августа 2010

Удара в темноте: реализованы ли new[] и delete[]? Список будет создавать по одному элементу за раз с new, в то время как вектор, скорее всего, выделит большие блоки памяти с new[].

5 голосов
/ 18 августа 2010

Согласно нашему обсуждению выше, создание

std::vector<mySimpleStruct> v;

вместо

std::vector<int> v;

, кажется, работает правильно. Это должно означать, что проблема в том, что что-то делается в специализации некоторых функций для std :: vector в вашей стандартной библиотеке шаблонов. Я предполагаю, что вы уже знакомы со специализацией шаблонов, но если вы не:

http://www.parashift.com/c++-faq-lite/templates.html#faq-35.7

Кроме того, как только вы выяснили, где настоящая проблема, не могли бы вы вернуться и опубликовать ответ здесь? Мне интересно, где сейчас настоящая проблема, плюс ответ может быть полезен для других, пытающихся собрать свои собственные ядра ОС.

1 голос
/ 31 августа 2010

Используете ли вы пользовательский или стандартный по умолчанию?

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

И да, пожалуйста, напишите, как только решите, - это помогает всем остальным OSDverters.

...