сбой push_back в VC6 - PullRequest
       33

сбой push_back в VC6

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

Я знаю, что 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 и обнаруживает неясные ошибки.

Ответы [ 2 ]

0 голосов
/ 24 января 2012

Мы решили эту проблему с помощью локального вектора (keyIDs является членом класса).Каким-то образом какой-то фрагмент кода в другом месте, который я не чувствую отслеживанием, (возможно) повреждает вектор, делая его бесполезным.Почему это происходит только с VC6?Это останется загадкой.

0 голосов
/ 21 января 2012

В Visual Studio 6 целые числа составляют 32 бита.

Попробуйте использовать __ int64 в качестве типа данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...