Я знаю, что VC6 - это технология 20-го века, но по каким-то особым причинам я должен использовать этот компилятор.
У меня есть следующий код, который прекрасно работает в Visual Studio Express 2008 (32 бита)
while( sqlite3_step( stmt ) == SQLITE_ROW ) {
int tmp;
tmp = sqlite3_column_int64( stmt, 0 );
if(DEBUG) { cout << "KeyID - " << tmp << endl ; };
keyIDs.push_back(tmp);
if(DEBUG) { cout << "Size keyIDs - " << keyIDs.size() << endl ; };
}
В этом конкретном тестовом примере есть только одна запись, поэтому, как и следовало ожидать, вывод будет
KeyID - 1
Размер идентификатора ключа - 1
Однако, если я скомпилирую весь материал (включая sqlite3) с VC6 (32 бита), у меня будет следующий результат:
KeyID - 1
Размер идентификатора ключа - 0
идентификаторы клавиш определены как
vector<sqlite3_int64> keyIDs;
но мы даже попытались изменить его на
vector<int> keyIDs;
У меня заканчиваются идеи о том, что может быть не так, поэтому я принимаю даже дикие догадки?
EDIT:
Мы решили эту проблему с помощью локального вектора (keyIDs является членом класса). Каким-то образом какой-то фрагмент кода в другом месте, который я не чувствую отслеживанием, (возможно) повреждает вектор, делая его бесполезным. Почему это происходит только с VC6? Это останется загадкой.
EDIT2:
Хотя я не дошел до основной причины, я обнаружил еще одну проблему (в другом проекте) с большой строкой (2800+ символов), переданной функции. Сама функция получила что-то вроде
function("something"+largestring+"anotherstring")
и это вызвало исключение памяти в другом месте (по совпадению, с вектором). Это было решено с помощью
largestring = "something";
largestring += stuff;
largestring += "anotherstring";
function (largestring);
В заключение кажется, что что-то не так, когда VC6 создает большой объект в куче, и это может повредить память.
Надеюсь, это поможет кому-то, кто, как и я, застрял в VC6 и обнаруживает неясные ошибки.