簡體   English   中英

訪問沖突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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM