вектор — «итератор не разыменовывается» C ++ Stack

Понятия не имею, что здесь происходит. У меня есть стандартный стек Vector3D (3-мерный векторный класс, предоставленный мне моим преподавателем). Я поместил два Vector3D в стек, но когда я иду к верхнему с vectorStack.top (), я получаю эту очень бесполезную ошибку:

Ошибка отладки!

Выражение: deque итератор не разыменовывается

Я подумал, что может быть что-то не так с конструктором копирования Vector3D, но я попытался создать свою собственную быструю структуру Vector3D (удаляя старую, которую мне дали), и это тоже не работает!

Вот код:

D3Dapp.cpp
if (!lsys.initialised)
{
LSystem::ReproductionRule r1;
r1.from = 'F';
r1.to = "F+F-[FFF]";
lsys.rules.push_back(r1);

LSystem::ReproductionRule r2;
r2.from = 'F';
r2.to = "FF";
lsys.rules.push_back(r2);

lsys.result = lsys.generateResult("F", 0, 5);
lsys.currentPosition = Vector3D(0.0f,0.0f,0.0f);
lsys.vectorStack.push(lsys.currentPosition);

lsys.initialised = true;
}

lsys.result = "[FF]+FF";

if (!lsys.complete)
{
for (int i=0; i < lsys.result.length();i++)
{
// F move forward
if (lsys.result[i] == 'F')
{
float cosAng = cos(lsys.angle);
float sinAng = sin(lsys.angle);

Vector3D currentPosition(lsys.vectorStack.top());

Vector3D newPosition = Vector3D(
currentPosition.x + (cosAng * 0.5f),
currentPosition.y + (sinAng * 0.5f),
currentPosition.z);

//lsys.vectorStack.push(newPosition);

Vertex s, e;
s.x = currentPosition.x;
s.y = currentPosition.y;
s.z = currentPosition.z;
e.x = newPosition.x;
e.y = newPosition.y;
e.z = newPosition.z;

startList.push_back(s);
endList.push_back(e);

lsys.currentPosition = newPosition;

// + turn right
} else if (lsys.result[i] == '+')
{
float rdn = 3.141592f / 180.0f;
lsys.angle = (lsys.angle + 20.0f);

// - turn left
} else if (lsys.result[i] == '-')
{
float rdn = 3.141592f / 180.0f;
lsys.angle = (lsys.angle - 20.0f);

// [ push stack
} else if (lsys.result[i] == '[')
{
lsys.vectorStack.push(lsys.currentPosition);

// ] pop stack
} else if (lsys.result[i] == ']')
{
lsys.vectorStack.pop();
}
}

lsys.currentPosition = Vector3D(0.0f,0.0f,0.0f);
}

lsys.complete = true;

Стек в lsystem просто stack<Vector3D> vectorStack;

Я пробовал различные способы присвоения vectorStack.top () текущей позиции, но, похоже, ничего не работает.

Для полноты, вот конструкторы для Vector3D:

Vector3D.h
Vector3D() {
x = y = z = 0;
}

Vector3D(double a, double b, double c) {
x = a;
y = b;
z = c;
}

Vector3D(const Vector3D& v) {
x = v.x;
y = v.y;
z = v.z;
}

РЕДАКТИРОВАТЬ: чтобы доказать, что есть что-то в стеке
Скриншот

Это строка в стеке, которая выдает ошибку
screenshot2

2

Решение

Есть только два способа, которыми я могу подумать, что может вызвать такую ​​проблему. Во-первых, где-то в вашей программе есть повреждения памяти, что, возможно, но мы должны рассмотреть только после устранения других наших опций.

Второй вариант заключается в том, что стек фактически пуст. Ваш скриншот не показывает нам внутренний размер стека, он только показывает, что в какой-то момент он выделил память для двух элементов и поместил их в стек. Скорее всего, вы удалили эти элементы, и стек пуст, но все еще указывает на, казалось бы, действительную память. Вы можете доказать или опровергнуть это, просто положив некоторые couts толкает и выталкивает в ваш стек, а также печать lsys.vectorStack.size() перед звонком top,

1

Другие решения

Оказывается, что фреймворк, который я использую (вынужден использовать), построен с учетом очень строгих требований к памяти, есть несколько вызовов ZeroMemory, которые, похоже, выделяют этот объем памяти и только этот объем памяти.

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

ZeroMemory( this, sizeof(D3dApp) )

После того, как я удалил вышеупомянутое, у меня все еще были некоторые проблемы, но я последовал совету Марка Б.

Большое спасибо.

0

По вопросам рекламы [email protected]