文字列を削除した後、C ++でヒープ破損が検出されました

スティーブベレンバウム

このコードを実行すると、次の画像に示すようなエラーが発生します。

GCCコンパイラで実行してみましたが、正常に動作しました。しかし、Windows上のVisual Studioで実行すると、このエラーが発生しました。

デバッグエラー!

プログラム:C:\ Users \ yudab \ source \ repos \ Project2 \ Debug \ Project2.exe

検出されたヒープ破損:0x014FD2E0の通常ブロック(#153)の後。

CRTは、ヒープバッファの終了後にアプリケーションがメモリに書き込んだことを検出しました。

いくつかのテストの後、エラーは2番目の単語を削除しようとした後にのみ表示されるようです。

#include <cstring>
#include <string>
#pragma warning(disable : 4996)

#include <iostream>
using namespace std;

void delStr(char**& lexicon, int& lexSize, char word[]);
void printAll(char** lexicon, int lexSize);
void retract2dArr(char**& arr, int& size);

int main() {                    
    char** lexicon = new char* [3]; 
    lexicon[0] = new char[6]{ "hello" };
    lexicon[1] = new char[5]{ "test" };
    lexicon[2] = new char[6]{ "world" };
    int size = 3;
    char removeTest[5] = { "test" }; //The first word I want to remove from the list
    char removeWorld[6] = { "world" }; //The second word I want to remove from the list

    printAll(lexicon, size); //First prints the entire list

    delStr(lexicon, size, removeTest); //Removes the first word
    delStr(lexicon, size, removeWorld); //Removes the second word

    printAll(lexicon, size); //Prints the list after deleting the words



    return 0;
}

void delStr(char**& lexicon, int& lexSize, char word[]) {

    bool toDelete = false;
    for (int i = 0; i < lexSize; i++) {
        if (strcmp(lexicon[i], word) == 0) {
            toDelete = true;
            for (; i < lexSize - 1; i++) {
                strcpy(lexicon[i], lexicon[i + 1]);
            }
        }
    }

    if (toDelete == true) {
        delete[] lexicon[lexSize - 1];
        retract2dArr(lexicon, lexSize);
    }

    return;
}

void printAll(char** lexicon, int lexSize) {

    for (int i = 0; i < lexSize; i++) {
        cout << lexicon[i];
        if (i != lexSize - 1) {
            cout << " ";
        }
    }
    cout << endl;

    return;
}


void retract2dArr(char**& arr, int& size) {

    size--;

    char** newArr = new char* [size];
    for (int i = 0; i < size; i++) {
        *(newArr + i) = *(arr + i);

    }

    printAll(newArr, size);
    delete[] arr;
    arr = newArr;

    return;
}
アブラハムムルシアーノベンザドン

kiran Biradarが指摘したように、strcpyここで責任があります。レキシコン内の各単語を前の単語に割り当てられたメモリにコピーする代わりに、lexicon配列を使用してポインタを単純に戻す方がよいでしょう

delStr関数に対して次のようなものを試してください

void delStr(char**& lexicon, int& lexSize, char word[]) {
    for (int i = 0; i < lexSize; i++) {
        if (strcmp(lexicon[i], word) == 0) {
            delete[] lexicon[i];
            for (; i < lexSize - 1; i++) {
                lexicon[i] = lexicon[i + 1];
            }
            retract2dArr(lexicon, lexSize);
        }
    }
}

PStoDeleteフラグを使用する必要はありませんでしたretract2dArr最初の内で、関数を呼び出すことができますif

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

ヒープの破損が検出されました| C

分類Dev

ヒープ破損が検出されましたMalloc()Free()

分類Dev

ヒープの破損が検出されましたか?

分類Dev

ヒープ破損が検出されました-iPhone5Sのみ

分類Dev

ヒープの破損により、C ++でエラーが検出されました

分類Dev

デストラクタでヒープの破損が検出されました

分類Dev

C ++:通常のブロック後にヒープの破損が検出されました

分類Dev

C ++:通常のブロック後にヒープの破損が検出されました

分類Dev

クラス内のいくつかの配列でdelete []を呼び出しているときに「ヒープ破損が検出されました」-C ++

分類Dev

C-アレイを解放するときにヒープ破損が検出されました

分類Dev

通常のブロック後にヒープの破損が検出されました(#181)

分類Dev

ヒープの破損が検出されました:通常のブロック後(#176)

分類Dev

通常のブロック #63 の後にヒープ破損が検出されました

分類Dev

エラーc ++アサーションの失敗ヒープの破損が検出されました

分類Dev

デバッグエラー:ヒープの破損が検出されました

分類Dev

iOSエラー:ヒープの破損が検出され、空きリストが破損し、ガード値が正しくありません:0

分類Dev

検出されたヒープ破損:通常のブロック後()

分類Dev

動的配列を削除した後のヒープの破損

分類Dev

glibcが検出されました-ダブルフリーまたは破損(!prev)

分類Dev

c ++ delete [] 2D配列によりヒープが破損しました

分類Dev

shared_ptrが破棄されたときのヒープの破損

分類Dev

free()の呼び出しでヒープが破損した理由は何ですか?

分類Dev

破損したヒープをクリーンアップできますか?

分類Dev

スタックの破損が検出され、dalvikVMがクラッシュしました

分類Dev

文字が最後に出現した後の文字列を削除します

分類Dev

newまたはdeleteを使用していないのに、なぜヒープが破損するのですか?

分類Dev

C ++の多重継承とアップキャストされたスマートポインターの破壊により、VS2017でヒープが破損します

分類Dev

strcatを2回使用した後のヒープ破損

分類Dev

破損したXPOSを搭載したラップトップを渡されました-Ubuntuをインストールするのが好きです

Related 関連記事

  1. 1

    ヒープの破損が検出されました| C

  2. 2

    ヒープ破損が検出されましたMalloc()Free()

  3. 3

    ヒープの破損が検出されましたか?

  4. 4

    ヒープ破損が検出されました-iPhone5Sのみ

  5. 5

    ヒープの破損により、C ++でエラーが検出されました

  6. 6

    デストラクタでヒープの破損が検出されました

  7. 7

    C ++:通常のブロック後にヒープの破損が検出されました

  8. 8

    C ++:通常のブロック後にヒープの破損が検出されました

  9. 9

    クラス内のいくつかの配列でdelete []を呼び出しているときに「ヒープ破損が検出されました」-C ++

  10. 10

    C-アレイを解放するときにヒープ破損が検出されました

  11. 11

    通常のブロック後にヒープの破損が検出されました(#181)

  12. 12

    ヒープの破損が検出されました:通常のブロック後(#176)

  13. 13

    通常のブロック #63 の後にヒープ破損が検出されました

  14. 14

    エラーc ++アサーションの失敗ヒープの破損が検出されました

  15. 15

    デバッグエラー:ヒープの破損が検出されました

  16. 16

    iOSエラー:ヒープの破損が検出され、空きリストが破損し、ガード値が正しくありません:0

  17. 17

    検出されたヒープ破損:通常のブロック後()

  18. 18

    動的配列を削除した後のヒープの破損

  19. 19

    glibcが検出されました-ダブルフリーまたは破損(!prev)

  20. 20

    c ++ delete [] 2D配列によりヒープが破損しました

  21. 21

    shared_ptrが破棄されたときのヒープの破損

  22. 22

    free()の呼び出しでヒープが破損した理由は何ですか?

  23. 23

    破損したヒープをクリーンアップできますか?

  24. 24

    スタックの破損が検出され、dalvikVMがクラッシュしました

  25. 25

    文字が最後に出現した後の文字列を削除します

  26. 26

    newまたはdeleteを使用していないのに、なぜヒープが破損するのですか?

  27. 27

    C ++の多重継承とアップキャストされたスマートポインターの破壊により、VS2017でヒープが破損します

  28. 28

    strcatを2回使用した後のヒープ破損

  29. 29

    破損したXPOSを搭載したラップトップを渡されました-Ubuntuをインストールするのが好きです

ホットタグ

アーカイブ