Сбой указателя на векторные данные

#c #vector

#c #вектор

Вопрос:

У меня есть класс, который управляет блоком памяти.

 class cPacket {
public:
cPacket( 
    : vBuffer( 96000 )
{
#ifdef USE_VECTOR
    myPacketBuffer = vBuffer.data();
#else
    myPacketBuffer = aPacketBuffer;

}

...

protected:
unsigned char * myPacketBuffer;
std::vector< unsigned char > vBuffer;
unsigned char aPacketBuffer[ 96000 ];
};
  

В коде для доступа к блоку памяти 96000 байт используется только указатель myPacketBuffer

При использовании массива все работает отлично.

При использовании vector все модульные тесты работают, но производственное приложение работает некоторое время, затем таинственно падает глубоко в системном коде, по-видимому, что-то связанное с выделением памяти

 Program received signal SIGTRAP, Trace/breakpoint trap.
  

введите описание изображения здесь

Использование вектора будет намного удобнее — я могу выделить меньшие блоки памяти, если максимум не нужен.

В чем разница между использованием массива и вектора, что может вызывать сбои при использовании вектора.

Комментарии:

1. Вы передаете cPacket объекты по значению? Например, передача в качестве аргумента функции или возврат объекта из функции? Соблюдаете ли вы правила трех, пяти или нуля ?

2. Трассировка стека выглядит поврежденной. Есть ли в вашем классе надлежащий конструктор копирования / оператор присваивания копирования? Если нет, обязательно удалите их, чтобы они не были случайно скопированы

3. Вы вставляете все данные в вектор сразу? Если нет, имейте в виду, что итераторы и указатели на вектор становятся недействительными, если изменяется внутренняя емкость вектора.

4. @Yexo Удаление конструктора копирования не имело никакого значения. Однако я думаю, что это вполне может быть проблемой — копия будет указывать на буфер, принадлежащий оригиналу, и когда он будет удален, весь ад вырвется на свободу.

5. кроме того, запуск конца вектора по сравнению с локальным буфером приведет к засорению другой памяти, что приведет к различному неопределенному поведению. Вы уверены, что не заканчиваете работу (обратите внимание, что вы обходите стороной проверки границ векторов с помощью data())