我做一個DLL在C++和我得到這個錯誤我第二次調用一個函數:調試斷言失敗的類的析構
調試斷言失敗表達式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)
我做了一些研究,這似乎當我delete
的對象,我沒有new
這裏是我認爲的代碼失敗
class tFont
{
public:
tFont(char chars[], __int64 cods[], int count);
~tFont();
int fontCount = 0;
char* characters = NULL;
long long* codes = NULL;
std::vector<std::pair<char,long long>> exceptions;
char getCharacter(long long code);
};
tFont::tFont(char chars[], long long cods[], int count)
{
characters = new char[count];
codes = new long long[count];
fontCount = count;
for (int i = 0; i < count; i++)
{
characters[i] = chars[i];
codes[i] = cods[i];
}
}
tFont::~tFont()
{
delete[] characters;
delete[] codes;
}
發生
錯誤發生後,視覺工作室停在delete[] characters;
。
我tryied這沒有任何的運氣
if (characters != NULL)
{
delete[] characters;
}
if (codes != NULL)
{
delete[] codes;
}
我只能創建這個類的一個instace作爲靜態對象
tFont* getCapFont()
{
static tFont *capFont = NULL;
if (capFont == NULL)
{
char characters[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
long long codes[] = { 241136, 441, 183861, 102321, 45836, 5955, 19305, 7871, 220321, 102286 };
int fontCount = 10;
capFont = new tFont(characters, codes, fontCount);
pair<char, long long> e;
e.first = '0';
e.second = 24045;
capFont->exceptions.push_back(e);
}
return capFont;
}
爲什麼叫析構函數,即使我永遠不會做delete capFont
謝謝!
EDIT2:我照「jarmod」之稱,並引發該錯誤的時刻是當這個函數結束
void analysis::singleLineTextReader(tImage img, char result[], tFont font)
我說這happend我第二次調用該函數,這是可能的當singleLineTextReader
結束時調用其參數font
的析構函數?其在上文
只是猜測,但請參閱[3/5/0規則](http://en.cppreference.com/w/cpp/language/rule_of_three)。我也建議看看['std :: vector'](http://en.cppreference.com/w/cpp/container/vector),['std :: unique_ptr'](http://en.cppreference。 com/w/cpp/memory/unique_ptr)和['std :: shared_ptr'](http://en.cppreference.com/w/cpp/memory/shared_ptr)。 –
在各種方法中添加一些調試打印語句,看看發生了什麼。這可能不是你的想法。另外,在調用delete之前,沒有必要絕對需要測試NULL,但是在調用delete之後將空指針置零是一種很好的做法(並且可以選擇在刪除它之前聲明它不是null,以便在您意外地捕獲編碼錯誤雙刪除一個指針)。 – jarmod
Edit2之後:'singleLineTextReader'通過值*獲取它的參數*,這意味着它創建了一個字體的副本。該副本將包含在構造函數中創建的指針的副本,並且這些副本將在析構函數中被刪除。之後,原始字體對象將包含懸掛指針。 –