访问冲突 C++?
Access Violation c++?
我的程序由于异常访问冲突而崩溃。当缓存变满并开始移动时,它会持续发生。这段代码有什么问题?
我的程序由于异常访问冲突而崩溃。当缓存变满并开始移动时,它会持续发生。这段代码有什么问题?
#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];
}
下移缓存后,尝试将 m_ownersManagers
的最后一个变量设置为 0。
在块末尾使用
if (cacheIndex < 0)
{
循环此行后:
m_ownersManagers[cacheIndex] = (A3DTopoItemOwnersManager *)0;
我的程序由于异常访问冲突而崩溃。当缓存变满并开始移动时,它会持续发生。这段代码有什么问题?
我的程序由于异常访问冲突而崩溃。当缓存变满并开始移动时,它会持续发生。这段代码有什么问题?
#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];
}
下移缓存后,尝试将 m_ownersManagers
的最后一个变量设置为 0。
在块末尾使用
if (cacheIndex < 0)
{
循环此行后:
m_ownersManagers[cacheIndex] = (A3DTopoItemOwnersManager *)0;