簡體   English   中英

錯誤調試斷言失敗-刪除動態分配的數組時

[英]error Debug Assertion Failed - when deleting a dynamically allocated array

我一直在嘗試完成課程作業,但是我一直收到似乎無法解決的錯誤。 調試斷言失敗我將問題(我認為)縮小到了析構函數。 如果我在行中delete[] english; 沒有錯誤。 我嘗試閱讀其他線程,但是它們並沒有幫助解決此問題。 這是項目中的三個文件(我刪除了所有其余代碼,因為僅此錯誤仍然發生):

這是頭文件:

//Dictionaty.h
#ifndef DICTIONARY_H
#define DICTIONARY_H

class Dictionary
{
public:
    Dictionary();
    ~Dictionary();

   void setEnglish(char*);
   char* getEnglish();


private:
    char *english;

};

#endif

這些功能在這里:

//dictionary.cpp
#include <iostream>
#include "Dictionary.h"

using namespace std;

Dictionary::Dictionary()
{
    english = new char[20];


    strcpy(english, " ");
    //strcpy(french, " ");
}

Dictionary::~Dictionary()
{
    delete[] english; // problem is here (i think)

}

void Dictionary::setEnglish(char *eng)
{
    english = eng;
    cout << "the value of english in \"setEnglish()\" is: " << english << endl; //db
}

這是驅動程序:

//dictionaryDrv.cpp
#include <iostream>
#include "Dictionary.h"

using namespace std;

int main()
{
    Dictionary words[30];

    //readIn(words);
    char test[5] = "test";
    words[0].setEnglish(test);


    system("pause");
    return 0;
}

顯示的代碼中存在多個錯誤。

english = new char;

這會將english設置為一個動態分配的一個字符數組,然后立即將其設置為:

strcpy(english, " ");

這會將兩個char -一個空格和一個\\0復制到僅一個字符的緩沖區中。 這在數組末尾運行,破壞了內存,並導致未定義的行為。

此外,在析構函數中:

 delete[] english; 

就其本身而言,這很好。 除了:

void Dictionary::setEnglish(char *eng)
{
    english = eng;

main()調用此方法的結果是, english被設置為指向未在動態范圍內分配的緩沖區的指針。 結果,析構函數將嘗試delete不是new 這也會導致未定義的行為。

此外,展望未來,所示類違反了3規則 ,因此,很容易錯誤地使用它,從而導致進一步的錯誤。

總之,顯示代碼不正確處理動態分配的內存,犯沿着那些幾個錯誤,從覆蓋未分配的內存,以delete荷蘭國際集團的內存,這是從來沒有new擺在首位編輯。

您需要重新閱讀和研究C ++書中有關如何正確使用動態分配的內存的章節。

問題是

char test[5] = "test";
words[0].setEnglish(test);

然后將成員varialbe english分配給從數組test衰減的指針,該指針不是使用new[]動態分配的,因此無法delete[] ed,但這正是析構函數試圖執行的操作。 因此UB。

根據代碼的意圖,您應該在Dictionary::setEnglish使用strcpystrncpy ,不要直接分配指針。

其他建議:

  1. 考慮一下“三規則” ,尤其是在使用原始指針(例如char* )時。

  2. 使用std :: string而不是C樣式的字符串( char* )。

 `char test[5] = "test"; words[0].setEnglish(test);` 

這里的測試分配在堆棧中(那里沒有new )。 然后english = eng; 會將english指針指向它,您不能從堆棧中delete

解決方法:由於您希望對象擁有該字符串,因此應該將其復制

void Dictionary::setEnglish(char *eng)
{
    delete[] english;
    english = new char[strlen(eng) + 1];
    strcpy(english, eng);
    cout << "the value of english in \"setEnglish()\" is: " << english << endl; //db
}

最后,最好使用std :: string並避免很多頭痛。

問題是如何在setEnglish方法中設置值, 英語= eng的分配沒有正確分配值,因此,如果使用strcpy可以解決:

采用:

    void Dictionary::setEnglish(char *eng) {
        strcpy(english,eng);
        cout << "the value of english in \"setEnglish()\" is: " << english << endl; 
}

你會得到正確的行為

暫無
暫無

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

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