Нарушение доступа с ++?

Моя программа падает из-за нарушения прав доступа к исключениям. Это происходит последовательно, когда кеш заполнен и начинает сдвигаться. В чем проблема с этим кодом?

Моя программа падает из-за нарушения прав доступа к исключениям. Это происходит последовательно, когда кеш заполнен и начинает сдвигаться. В чем проблема с этим кодом?

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

#include "TopologyOwnersManagerCache.h"
#include <iostream>
using namespace std;

TopologyOwnersManagerCache::TopologyOwnersManagerCache()
{
m_cacheSize = 10;
m_cacheEmptyIndex = 0;
m_ownersManagers = new A3DTopoItemOwnersManager *[m_cacheSize];
m_brepItems = new A3DRiRepresentationItem *[m_cacheSize];

for (int i = 0; i < m_cacheSize; i++)
{
m_ownersManagers[i] = (A3DTopoItemOwnersManager *)0;
m_brepItems[i] = (A3DRiRepresentationItem *)0;
}
}TopologyOwnersManagerCache::~TopologyOwnersManagerCache()
{
for (int i=0; i < m_cacheSize; i++)
{
if (m_ownersManagers[i])
{
// Release the map
A3DTopoItemOwnersManagerGet((A3DRiRepresentationItem *)0, m_ownersManagers[i]);
}
}

delete[] m_ownersManagers;
delete[] m_brepItems;
}A3DTopoItemOwnersManager *
TopologyOwnersManagerCache::getOwnersManager(A3DRiRepresentationItem *brepOwner)
{
// Check if it is in the cache
for (int i=0; i < m_cacheSize; i++)
{
if (m_brepItems[i] == brepOwner)
{
return m_ownersManagers[i];
}
}

// If the cache is full, remove the first entry and shift the rest down
int cacheIndex = m_cacheEmptyIndex;
if (cacheIndex < 0)
{
cout << "Shifting cache down!" << endl;
cacheIndex = m_cacheSize - 1;

// Release the map of the first entry
cout << "About to release : " << m_ownersManagers[0] << endl;
A3DTopoItemOwnersManagerGet((A3DRiRepresentationItem *)0, m_ownersManagers[0]);
for (int i=1; i < m_cacheSize; i++)
{
m_ownersManagers[i-1] = m_ownersManagers[i];
m_brepItems[i-1] = m_brepItems[i];
}
}

m_brepItems[cacheIndex] = brepOwner;

//crash is happening here on A3DTopoItemOwnersManagerGet() call
if (A3DTopoItemOwnersManagerGet(brepOwner, m_ownersManagers[cacheIndex]) != A3D_SUCCESS)
{
return  (A3DTopoItemOwnersManager *)0;
}

// Check if the cache is full now
m_cacheEmptyIndex++;
if (m_cacheEmptyIndex >= m_cacheSize)
{
m_cacheEmptyIndex = -1;
}return m_ownersManagers[cacheIndex];

}

0

Решение

Попробуйте установить последнюю переменную m_ownersManagers как 0 после смещения кеша вниз.
Используйте в конце блока

    if (cacheIndex < 0)
{

после цикла этой строки:

    m_ownersManagers[cacheIndex] = (A3DTopoItemOwnersManager *)0;
0

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

Других решений пока нет …

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