В моём проекте, разрабатываемом на Visual Studio 2012, я помещаю структуру моего типа MyStruct в std::vector<MyStruct> . Размер структуры MyStruct -- 16008 байт.
При помещении в этот вектор с помощью функции push_back у меня в отладчике выскакивает следующее сообщение об ошибке:
Необработанное исключение по адресу 0x00F12979 в MyProject.exe:
0xC000041D: Во время обратного вызова пользователя обнаружено необработанное исключение.
При этом отладчик останавливается в файле vector в функции:
При попытке выделить память в этом векторе с помощью функции reserve(sizeof(MyStruct)); у меня в отладчике выскакивает следующее сообщение об ошибке:
Необработанное исключение по адресу 0x00A633C9 в MyProject.exe:
0xC000041D: Во время обратного вызова пользователя обнаружено необработанное исключение.
При этом отладчик останавливается в файле vector в функции:
Здравствуйте, RussianFellow, Вы писали:
RF>Что это означает? Как решить эту проблему--как поместить структуру типа MyStructm размером в 16008 байт в std::vector<MyStruct> ?
* std::length_error if new_cap > max_size().
* any exception thrown by Allocator::allocate() (typically std::bad_alloc)
If an exception is thrown, this function has no effect (strong exception guarantee).
If T's move constructor is not noexcept and T is not CopyInsertable into *this, vector will use the throwing move constructor. If it throws, the guarantee is waived and the effects are unspecified.
Согласен с коллегами, ошибка в векторе наведенная, накосячил где-то ранее.
RF>При попытке выделить память в этом векторе с помощью функции reserve(sizeof(MyStruct)); у меня в отладчике выскакивает следующее сообщение об ошибке:
Обращаю твое внимание, что здесь ты пытаешься выделить память под массив из 16008 элементов (reserve принимает размер в штуках, а не в байтах).
Ну и напоследок, а точно нужна структура такого размера?
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, RussianFellow, Вы писали:
RF>В моём проекте, разрабатываемом на Visual Studio 2012, я помещаю структуру моего типа MyStruct в std::vector<MyStruct> . Размер структуры MyStruct -- 16008 байт. RF>При помещении в этот вектор с помощью функции push_back у меня в отладчике выскакивает следующее сообщение об ошибке:
Это нужно MyStruct смотреть.
RF>При попытке выделить память в этом векторе с помощью функции reserve(sizeof(MyStruct)); у меня в отладчике выскакивает следующее сообщение об ошибке:
Это сильно. 16008 — это какое то волшебное число, что ты его везде пихаешь?
reserve(sizeof(MyStruct)) это выделение памяти для 16008 элементов, каждый из которых занимает 16008 байт. Итого — 256256064 байт.
Не ахти какой объем.
Но если у тебя там есть еще аналогичный код и сборка под 32-бита, то да — памяти может и не хватить.
RF>Что это означает? Как решить эту проблему--как поместить структуру типа MyStructm размером в 16008 байт в std::vector<MyStruct> ?
Ну не знаю, может надо таки начать с чтения "С++ для чайников", как я тебе советовал
Если бы ты написал: Perturbation_set* m_EarthGravPerturb = nullptr;
То найти ошибку было бы проще. Почему члены класса не инициализируешь? Сколько лет опыта для таких глупых ошибок?
Здравствуйте, Nuzhny, Вы писали:
RF>>Что я делаю не так?
N>Если бы ты написал: Perturbation_set* m_EarthGravPerturb = nullptr; N>То найти ошибку было бы проще. Почему члены класса не инициализируешь? Сколько лет опыта для таких глупых ошибок?
Здравствуйте, RussianFellow, Вы писали:
RF>Часть кода из приведённого не я писал.
Код ужасен весь.
int setPerturbation(Perturbation* perturbation, int i)
{
arr[i] = perturbation;
return arr.size();
}
Где сравнение на выход из диапазона?
LDouble r_grav[20];
LDouble c[700]; //36x36
LDouble s[700]; //36x36int nt ;
LDouble sq[201];
LDouble sk[100];
LDouble hp[37];
int nai[478];
Вау, меджик намберс. Нет слов.
GravField* m_EarthGrav;
Perturbation_set* m_EarthGravPerturb;
if ((ff->m_MEF.n0>0)||(ff->m_MEF.ntes>0))
// нецентральное гравитационное поле Земли
{
nz = ff->m_MEF.n0;
nt = ff->m_MEF.ntes;
i1 = (ff->m_MEF.flag)/10;
fg = ff->m_MEF.flag - i1*10;
if (fg==1)
{
m_EarthGrav = new GravField(ff->m_MEF.NAMEpol,nz,nt);
//mysize = sizeof(GravField);
//m_EarthGravPerturb->reserve(mysize); // здесь бьётся программа
//m_EarthGravPerturb->reserve(1); // здесь бьётся программа
m_EarthGravPerturb->addPerturbation(m_EarthGrav); // здесь бьётся программа
}
}
m_EarthGravPerturb не инициализируется в конструкторе, но в него начинаешь добавлять элементы? Кстати — это и есть причина начальной ошибки.
Здравствуйте, RussianFellow, Вы писали:
RF>Часть кода из приведённого не я писал.
Хорошо. Но:
1. Переменные всё равно лучше инициализировать сразу. Ещё хорошей практикой является объявление переменных не в начале функций а в момент их использования, например: int i1, fg;
Такого лучше избегать, в том месте это вообще лишнее. И теперь можно инициализировать члены класса не только в конструкторе, но и сразу при объявлении. Не пренебрегай этим, многие ошибки сразу исчезнут сами собой. Это защита как от забывчивости, так и логически верно: конструкторов может быть много, не надо копи-пастить инициализацию.
1. Начни обрабатывать исключения. Я уже давал ссылку выше, сделай try-catch и посмотри, что происходит. Это норма для С++ следить за тем, что память выделяется или не выделяется.
2. Если первое не помогло, то сделай из своего большого проекта минимальный приводящий к ошибке. Комментируй, убирай функции и куски кода. Пользуйся отладчиков. Используй тулзы для отслеживания затираний/утечек памяти.