_free_dbg(块,_UNKNOWN_BLOCK);当我想删除用 new 启动的 [] 变量时出现异常

_free_dbg(block, _UNKNOWN_BLOCK); exception when I want to delete[] variable initiated with new

我正在寻找解决方案,但没有找到任何可以帮助我解决问题的方法。

EDIT 我不能在这个项目中使用 stl 库(所以 std::string、std:vector、std::cout 等都出局了)

我正在启动我的二维字符数组:

char** string = new char*[MAX_MENU]; // MAX_MENU is 3 in my case
for (int i = 0; i < MAX_MENU; i++) {
    string[i] = new char[20];
}
string[0] = "Start";
string[1] = "Leaderboard";
string[2] = "Quit";

然后当我退出应用程序时调用这个函数:

for (int i = 0; i < MAX_MENU; i++) {
    delete[] string[i];
}
delete[] string;

问题在于删除字符串[i]。当我不删除它时,问题不会发生,但我不想泄漏内存。

void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK); // (X) - here is the exception
    #else
    free(block);
    #endif
}

我该如何解决?

感谢@G.M。我找到了非常简单的解决方案

我刚刚删除了这部分代码

for (int i = 0; i < MAX_MENU; i++) {
    delete[] string[i];
}
for (int i = 0; i < MAX_MENU; i++) {
    string[i] = new char[20];
}

似乎没有内存泄漏,但我会离开程序 运行 大约一个小时来检查图表

根据评论,以下声明...

string[0] = "Start";

实际上将与字符串文字 "Start" 相关联的指针分配给 string[0],并且为 string[0] 分配并指向的原始 20 个字符块是 lost/leaked。

如果你真的不会使用std::vectorstd::string等,那么你仍然可以使用例如strncpy。所以代码将类似于...

char** string = new char*[MAX_MENU]; // MAX_MENU is 3 in my case
for (int i = 0; i < MAX_MENU; i++) {
    string[i] = new char[20];
    string[i][0] = '[=11=]';
}
strncpy(string[0], "Start", 20);
strncpy(string[1], "Leaderboard", 20);
strncpy(string[2], "Quit", 20);

请注意,我在每个 string[i] 之后立即添加了 string[i][0] = '[=18=]' 以确保空终止。