странная проблема std :: vector с uint32_t в Visual Studio 2008 - PullRequest
0 голосов
/ 17 ноября 2009

Это прекрасно работает:

std::vector<int> v;  
v.push_back(123);

но это выдает std :: length_error:

std::vector<uint32_t> v;// or vector<unsigned __int32>  
v.push_back(123);

Кажется, это происходит при изменении размера, потому что

std::vector<uint32_t> v;  
v.reserve(2);  

вызывает отладочное утверждение "iterator not dereferencable".

Это происходит в Visual Studio 2008, но тот же код отлично работает на Mac и Linux. Кто-нибудь может предложить способ сузить поиск объяснения?



ОБНОВИТЬ: Гнездо крыс статических и динамически связанных зависимостей в этом проекте сделало слишком трудоемким поиск нарушающей библиотеки. Я сдался и перестроил каждую зависимость от источника. Я потерял два дня своей жизни и до сих пор не знаю точно, где была проблема, но приложение работает! Спасибо за вашу помощь.

Ответы [ 4 ]

1 голос
/ 17 ноября 2009

Это

#include <iostream>
#include <vector>

int main()
{
    std::vector<unsigned __int32> v;
    v.reserve(2);
    std::cout << v.capacity() << '\n';
    return 0;
}

работает без сбоев для меня в VS 2008. Он печатает 2.

Что это делает для вас? Если это тоже работает, то мои первые несколько предположений:

  • Вы вызывали неопределенное поведение где-то раньше. К тому времени, когда исполнение попадет в код, который вы показали, все ставки сняты.
  • Это за пределами DLL, и вы связали вместе DLL / EXE, созданные с различными настройками.

Чтобы узнать об этом, нужно отогнать его до минимально возможного тестового примера, демонстрирующего поведение. (Он не должен содержать более 50LoC, в идеале - 10.) Если вы не нашли проблему при этом, добавьте пример к вашему вопросу.

0 голосов
/ 19 ноября 2009

VC ++ 2008 не предоставляет заголовок ISO C99, поэтому вы должны были как-то дать определение; возможно, определение ошибочно.

0 голосов
/ 19 ноября 2009

Можете ли вы проверить, есть ли в вашей реализации две или более typedefs для uint32_t? Особенно в разных пространствах имен? (Я знаю, что шансы довольно малы, но, возможно, оно того стоит - в поисках совместимости с платформой разные библиотеки пытаются сопоставить определенный размер памяти с типом, и одна из них могла бы ускользнуть).

0 голосов
/ 17 ноября 2009

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

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