Ошибка сегмента, вызванная использованием вектора - PullRequest
2 голосов
/ 23 января 2012

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

#include <vector>
using namespace std;

int main() {
    vector<char> v;
    v.push_back('s');

    return 0;
}

При выполнении строки vector<char> v; на экране появляется сообщение Segment Fault. Для дополнительной проверки я проверил оператор new, и он отлично работает. Я использую mipsel-elf-g++ для создания своего приложения.

Что не так?

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Как отмечено в комментариях, ваш компилятор и / или его библиотека времени выполнения повреждены. (Вы можете исключить ОС, так как цель «elf» подразумевает, что вы не используете ОС на цели, и если она не существует, она не может быть сломана.)

Вместо того, чтобы пытаться отлаживать пакет mipsel-elf-gcc Cygwin, который, вероятно, является старым и недостаточно хорошо протестированным, я бы предложил просто использовать другой компилятор. В частности, сборка Mentor Graphics «Sourcery CodeBench Lite Edition» компилятора GCC и связанных с ней библиотек C и C ++ доступна для бесплатной загрузки с http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/ - она ​​должна просто работать в качестве замены для Cygwin. используемый вами компилятор (включая корректную работу с путями Cygwin, даже если он номинально построен как компилятор «простой Windows»), с той разницей, что он был протестирован и проверен на правильную работу.

[Отказ от ответственности: я работаю в Mentor Graphics, поэтому не могу сказать, что я беспристрастен - но мы прилагаем немало усилий, чтобы этот компилятор работал, и MIPS заключает с нами контракт, чтобы сделать его доступным для Мир бесплатно, поэтому у нас есть стимул убедиться, что он работает правильно. Кроме того, если вы знакомы с компиляторами CodeSourcery «Sourcery G ++», «Sourcery CodeBench» - это новое имя для них, теперь, когда CodeSourcery является частью Mentor Graphics.]

1 голос
/ 23 января 2012

Я предполагаю, что вы создали кросс-библиотеку C ++ для mips. Проверьте, была ли библиотека правильно построена и была ли она действительно настроена для ваших mips. Вы также можете загрузить свой исполняемый файл в GDB и посмотреть, где именно происходит сбой. Я думаю, что это происходит где-то в libc ++.

...