Получение SIGSEGV / SIGABRT при выделении памяти для строки - PullRequest
2 голосов
/ 19 ноября 2010

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

template <class T>
inline string to_string (const T& t, bool use_fixed = false)
{
    stringstream ss;
    if (use_fixed) ss.setf(ios::fixed, ios::floatfield);
    ss << t;
    return ss.str();
}

В частности, происходит сбой при 'ss << t'. t был тип int, == 0. Последние строки трассировки стека выглядят так (увы, я слишком нов, чтобы опубликовать скриншот): </p>

0   ??  
1   malloc
2   operator new(unsigned int)
3   std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&)
4   std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int)
5   std::string::reserve(unsigned int)
6   std::basic_stringbuf<char, std::char_traits<char>, std:allocator<char> >::overflow(int)
...

Единственное, что может иметь отношение к моей программе, - это то, что она имеет несколько потоков и запускает дочерний процесс, который имеет несколько потоков, а также вызывает эту функцию. Я на Ubuntu 10.04. Спасибо за внимание -

Мэтт

Ответы [ 2 ]

4 голосов
/ 19 ноября 2010

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

2 голосов
/ 01 августа 2015

На самом деле Матиас Вальденегро дал вам правильный ответ. Однако он сделал это так, что вы этого не поняли: он сказал, что вы как-то повреждаете внутренние структуры данных распределителя памяти. И это именно то, что вы делали. Единственное, что вы не поняли (а Матиас не сказал вам): вы не повреждаете кучу кода, который вы цитировали здесь. Ты где-то портишь кучу иначе . Код в кавычках просто запускает сигнал прерывания, потому что именно в этот момент функции распределителя (т. Е. Оператор new) обнаруживают , что ваша куча была повреждена (где-то еще). И именно поэтому, в отличие от вашего комментария, C ++ es std :: to_string здесь вообще не поможет (также будет SIGABRT, если вы испортили кучу), и именно поэтому ошибка внезапно исчезла, пока вы работали над чем-то в другом месте. Вы, очевидно, просто исправили ошибку, вызывающую повреждение кучи.

Отличный инструмент для поиска такого рода ошибок называется valgrind, если вы еще не знаете об этом, вам, безусловно, следует это изменить, потому что он сказал бы вам не только о том, что происходит, но и о том, где на самом деле ошибка находится.

...