[英]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
使用strcpy
或strncpy
,不要直接分配指針。
其他建議:
考慮一下“三規則” ,尤其是在使用原始指針(例如char*
)時。
使用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.