_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::vector
、std::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=]'
以确保空终止。
我正在寻找解决方案,但没有找到任何可以帮助我解决问题的方法。
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::vector
、std::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=]'
以确保空终止。