メモリの読み取り/書き込みアクセスエラー例外

アレックスシュル

私のコードは不安定です。すべてが正常な場合もあれば、エラーメモリの読み取り/書き込みまたは_CrtIsValidHeapPointerがスローされる場合もあります。「リリースビルド」でプログラムを実行すると、メイン()で説明されているアクションの2回目の繰り返しでクラッシュしますが、「リリースビルド」の「デバッグモード」で実行すると、すべてのアクションにブレークポイントがあります-その後もすべて正常に動作しますmain()の3回の反復。まだ安定性がありません。わかりません-何が問題なのですか。助けてください。

PS質問投稿を再作成します。

Main.cpp

int main(...)
{
    // ...
    std::vector<CResource> m_aRes;
    uint8 testBuf[70000];

    m_aRes.push_back(CResource(70000));
    m_aRes.back().SetName("Test Name");
    m_aRes.back().SetType("Test Type");
    m_aRes.back().AppendData(testBuf, 70000);
    // ...
}

CResource.h

class CResource
{
protected:
    std::string m_sName;    
    std::string m_sSubName; 
    std::string m_sType;

    std::vector<uint8> m_Data;
UINT               m_DataLen;
public:
    CResource(UINT size);
    ~CResource();   

    void          SetName(char * name);
    void          SetType(char * type);
    const char *  GetName(void);
    const char *  GetType(void);
    const char *  GetSubName(void);
    bool          IsWhole(void);
    UINT          AppendData(uint8 * data, UINT len);
    uint8 *       GetData(void);
    UINT          GetDataLen(void);
    UINT          GetDataLenTemp(void);
};

CResource.cpp

CResource::CResource(UINT size)
{
    m_sName.clear();
    m_sSubName.clear(); 
    m_sType.clear();    

    m_DataLen = size;
    m_Data.reserve(m_DataLen);
}
CResource::~CResource()
{   
    m_sName.clear();
    m_sName.shrink_to_fit();
    m_sSubName.clear();
    m_sSubName.shrink_to_fit();
    m_sType.clear();
    m_sType.shrink_to_fit();    

    m_Data.clear();
    m_Data.shrink_to_fit(); 
}

void CResource::SetName(char * name)
{
    if(!name) return;

    m_sSubName.clear();
    m_sName = name;

    bool bSubNameFound = false;
    for(UINT i=m_sName.size(); i>0; i--) {
            if(bSubNameFound)
                    m_sSubName.insert(0 , &m_sName[i - 1]);
            if(m_sName[i] == '/')
                    bSubNameFound = true;
    }
}
void CResource::SetType(char * type)
{
    if(!type) return;

    m_sType = type;
}
const char * CResource::GetName(void) 
{ 
    return m_sName.c_str(); 
}
const char * CResource::GetType(void)
{ 
    return m_sType.c_str(); 
}
const char * CResource::GetSubName(void) 
{ 
    return m_sSubName.c_str();
}
bool CResource::IsWhole(void) 
{
    return (m_DataLen > 0 && m_DataLen == m_Data.size()) ? true : false; 
}
UINT CResource::AppendData(uint8 * data, UINT len)
{
    if(!data || !len || IsWhole() || m_DataLen == 0) return NULL;   

    UINT DataLenApp = m_Data.size() + len;

    if(DataLenApp > m_DataLen)                   
    {                                               
            len = m_DataLen - m_Data.size();             
            DataLenApp = m_DataLen;                     
    }   

    UINT nFirstApp = m_Data.size();
    for(UINT i = nFirstApp; i < DataLenApp; i++)
                m_Data.push_back(data[i - nFirstApp]);

    return len;
}
uint8 * CResource::GetData(void) 
{ 
    return m_Data.data(); 
}
UINT CResource::GetDataLen(void) 
{
    return m_DataLen; 
}
UINT CResource::GetDataLenTemp(void) 
{ 
    return m_Data.size();
}
ヨハン

ここで試してみました(g ++ 4.8.2-cygwin)クラッシュはありません。クラッシュに関連する適切な提案については、このコメント確認してください。

しかし、あなたは何をしようとしていますか?

m_DataLen = size;
m_Data.reserve(m_DataLen);

m_DataLenの同義語のようですm_Data.capacity()

ここでは、配列の再割り当てを禁止しています(IsWholeチェックm_Data.size()が次の値と等しくない場合m_DataLen

if(!data || !len || IsWhole() || m_DataLen == 0) return NULL; 

のこの二重定義を避けて使用することにより、少なくともチェックを単純化する必要がm_DataLenありますm_Data.capacity()

ところで、次のコードは間違っているようには見えませんが、必要なものよりもはるかに複雑です。

UINT nFirstApp = m_Data.size();
for(UINT i = nFirstApp; i < DataLenApp; i++)
   m_Data.push_back(data[i - nFirstApp]);

それは基本的に:

m_Data.insert(m_Data.end(), data, data + (DataLenApp - nFirstApp));

だから私の親指のルール:あなたのコードを単純化し、STDが提供するものを使用してください!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ブーストメモリマップトファイル:読み取り/書き込みアクセス

分類Dev

外部ライブラリのメソッドを使用しようとすると、読み取り/書き込みアクセスエラーが発生する

分類Dev

メモリへの読み取りおよび書き込みアクセスをカウントします

分類Dev

読み取りメモリへの書き込みスペース

分類Dev

メモリ保護されたプロセスのメモリの書き込み/読み取り

分類Dev

VB.NETアクセス-保護されたメモリの読み取りまたは書き込みを試みました

分類Dev

読み取りアクセスなしの書き込みアクセス

分類Dev

OSIモデルの最初の4つの層にアクセス/読み取り/書き込み/プログラム/リッスンする方法は?

分類Dev

メモリリークと無効な読み取り/書き込み

分類Dev

C ++、メモリの読み取りと書き込み、

分類Dev

クライアントサーバー方式で数値の二乗を取得するための共有メモリの書き込みと読み取り

分類Dev

C ++メモリアドレスとオフセット書き込み/読み取り

分類Dev

インメモリデータの読み取りと書き込み

分類Dev

安全でないコードでのメモリ割り当てを確認するためのメモリアドレスの読み取りと書き込み

分類Dev

C ++-<文字列の文字の読み取りエラー>および「アクセス違反の書き込み場所0x86A1ECD8」

分類Dev

Cソケット<変数の読み取りエラー:アドレス0xfffffffffffffffcのメモリにアクセスできません>

分類Dev

メモリを節約するリソースに対するJava読み取り/書き込みロック

分類Dev

スレッド「メイン」の例外java.security.AccessControlException:アクセスが拒否されました(java.util.PropertyPermission *読み取り、書き込み)

分類Dev

Valgrindでの書き込みと読み取りのエラー

分類Dev

XMLへの同時読み取り/書き込みアクセス

分類Dev

特定のアプリのHDDへの書き込み/読み取りアクセスを制限する方法

分類Dev

EEPROMアドレスの読み取り/書き込みは可能ですが、最初のメモリページの読み取り/書き込みのみが可能です

分類Dev

Visual Studio C ++での読み取りアクセス違反の例外をスローする書き込み関数

分類Dev

MvvmCross Uwpアプリの起動時の例外:「System.AccessViolationException:保護されたメモリの読み取りまたは書き込みを試みました」

分類Dev

読み取りと書き込みの両方でブーストIOstreamメモリマップを開く方法

分類Dev

.netのリソースへの読み取り/書き込み

分類Dev

メモリの読み取り時にアクセス違反

分類Dev

Python:ネットワークファイルの同時アクセス(読み取り/書き込み)

分類Dev

1つのディレクトリのみへの読み取り/書き込みアクセスをユーザーに許可します

Related 関連記事

  1. 1

    ブーストメモリマップトファイル:読み取り/書き込みアクセス

  2. 2

    外部ライブラリのメソッドを使用しようとすると、読み取り/書き込みアクセスエラーが発生する

  3. 3

    メモリへの読み取りおよび書き込みアクセスをカウントします

  4. 4

    読み取りメモリへの書き込みスペース

  5. 5

    メモリ保護されたプロセスのメモリの書き込み/読み取り

  6. 6

    VB.NETアクセス-保護されたメモリの読み取りまたは書き込みを試みました

  7. 7

    読み取りアクセスなしの書き込みアクセス

  8. 8

    OSIモデルの最初の4つの層にアクセス/読み取り/書き込み/プログラム/リッスンする方法は?

  9. 9

    メモリリークと無効な読み取り/書き込み

  10. 10

    C ++、メモリの読み取りと書き込み、

  11. 11

    クライアントサーバー方式で数値の二乗を取得するための共有メモリの書き込みと読み取り

  12. 12

    C ++メモリアドレスとオフセット書き込み/読み取り

  13. 13

    インメモリデータの読み取りと書き込み

  14. 14

    安全でないコードでのメモリ割り当てを確認するためのメモリアドレスの読み取りと書き込み

  15. 15

    C ++-<文字列の文字の読み取りエラー>および「アクセス違反の書き込み場所0x86A1ECD8」

  16. 16

    Cソケット<変数の読み取りエラー:アドレス0xfffffffffffffffcのメモリにアクセスできません>

  17. 17

    メモリを節約するリソースに対するJava読み取り/書き込みロック

  18. 18

    スレッド「メイン」の例外java.security.AccessControlException:アクセスが拒否されました(java.util.PropertyPermission *読み取り、書き込み)

  19. 19

    Valgrindでの書き込みと読み取りのエラー

  20. 20

    XMLへの同時読み取り/書き込みアクセス

  21. 21

    特定のアプリのHDDへの書き込み/読み取りアクセスを制限する方法

  22. 22

    EEPROMアドレスの読み取り/書き込みは可能ですが、最初のメモリページの読み取り/書き込みのみが可能です

  23. 23

    Visual Studio C ++での読み取りアクセス違反の例外をスローする書き込み関数

  24. 24

    MvvmCross Uwpアプリの起動時の例外:「System.AccessViolationException:保護されたメモリの読み取りまたは書き込みを試みました」

  25. 25

    読み取りと書き込みの両方でブーストIOstreamメモリマップを開く方法

  26. 26

    .netのリソースへの読み取り/書き込み

  27. 27

    メモリの読み取り時にアクセス違反

  28. 28

    Python:ネットワークファイルの同時アクセス(読み取り/書き込み)

  29. 29

    1つのディレクトリのみへの読み取り/書き込みアクセスをユーザーに許可します

ホットタグ

アーカイブ