2009-02-12 3 views
1
std::string sAttr(""); 
sAttr = sAttr+VAL_TAG_OPEN+sVal->c_str()+VAL_TAG_CLOSE; 

еще где в коде я определилвыполнения зависимостей для станд :: конкатенации

const char VAL_TAG_OPEN[] = "<value>"; 

sVal является переменной, которая извлекается прочь массив строковых указателей. Это отлично работает в большинстве систем, окон и Linux. Однако на сайте клиента, где, как я полагаю, есть версия Linux, на которой мы провели некоторое тщательное тестирование, произведите результат, как если бы я никогда не использовал VAL_TAG_OPEN и VAL_TAG_CLOSE. Полученные результаты приведены для

sAttr = sAttr+sVal->c_str(); 

Что происходит?. Содержит ли std :: string конкатенация в зависимости от времени выполнения?

ответ

2

Почему ->c_str()? Если sVal - std::string, попробуйте удалить этот вызов. Помните, что порядок оценки не определен, поэтому вы можете добавить указатели вместо конкатенации строк, потому что VAL_TAG_OPEN, sVal->c_str() и VAL_TAG_CLOSE - все простые строки C. Я предлагаю вам использовать оператор присваивания добавления +=, например. :

sAttr += VAL_TAG_OPEN; 
sAttr += *sVal; /* sVal->c_str() ? */ 
sAttr += VAL_TAG_CLOSE; 

(что должно быть быстрее в любом случае).

+0

Возможно, это будет (* sVal), но, конечно, может возникнуть вопрос, зачем использовать указатель здесь, если ссылки должны быть достаточными (как мне кажется, постоянный std :: string const & parameter). – gimpf

+0

sVal является указателем на std :: string. Кроме того, sVal - это единственное, что добавляется в любом случае. – rptony

+0

Вижу, я только что прочитал ответ перед вопросом, старая дурная привычка. – gimpf

1

Нет, std :: string конкатенация не должна зависеть от времени выполнения, но каким-то образом VAL_TAG_OPEN и VAL_TAG_CLOSE кажутся пустыми.

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

Как вы отмечаете, что при указании исходных указателей на std :: string экземпляры в необработанных массивах такие ошибки действительно не все невероятны, но их может быть сложно обнаружить, поскольку использование сборки DEBUG не даст вам никаких проверок итератора с все это все для RAW вещей ... Удачи.

0
sAttr = sAttr+VAL_TAG_OPEN+sVal->c_str()+VAL_TAG_CLOSE; 

Как и fbonnet, это вопрос оценки.

Если эта строка оценивается строго слева направо, то результатом каждого добавления является объект std :: string, который имеет перегрузку оператора для добавления, и все работает так, как вы ожидаете.

Если он не оценивается слева направо, вы завершаете добавление указателей вместе, и кто знает, что вы получите.

Избегайте этой конструкции и просто используйте оператор + = на std :: string.

+0

Нет, это не может быть порядок оценка предмет. left/right-binding оператора не зависит от порядка оценки, тип выражения зависит от выражения, а не от порядка выполнения во время выполнения! – gimpf

1

У меня нет оценки, которая вызывает проблему. Его из-за постоянные массивы полукокса в начале и в конце

оператора
const char VAL_TAG_OPEN[] = "<value>"; 
const char VAL_TAG_CLOSE[] = "</value>" 

конкатенации думал VAL_TAG_OPN и VAL_TAG_CLOSE как не пустая строка терминатора. Следовательно, оптимизатор просто проигнорировал их, считая это мусором.

sAttr += std::string(VAL_TAG_OPEN); 
sAttr += *sVal; 
sAttr += std::string(VAL_TAG_CLOSE); 

Это решение.

+0

Ну, во-первых: Хорошо, что эта бессмыслица по порядку оценки теперь опровергнута. Второе: все-таки это не должно иметь никакого значения. Какой компилятор вы используете? Я все еще озадачен этим, так как это заставляет меня нервничать, что я слепое место в какой-то важной части C++ ... – gimpf

+0

Исходный код хорошо работает в VS всех версиях. Клиент портировал код в linux с помощью gcc (однако не знаю версию). Это работает без ошибок на большинстве Linux-машин, кроме одного. Я действительно хотел получить больше информации, но у клиента нет терпения, и они довольны исправлением. :( – rptony

 Смежные вопросы

  • Нет связанных вопросов^_^