如何在C++中释放类实例数组?

如何在C++中释放类实例数组?,c++,heap-memory,C++,Heap Memory,我正在制作一个小游戏,我将地图存储在一个数组中,因为我认为不必告诉您我的地图不仅仅是一个字符数组,我已经制作了一个类: 枚举标记{N,Ex3,Ex2,Ex1,Pl,En,Pb,Eb}; 类MC/*映射组件*/{ 公众: 标记=标记::N; char ch='\0'; }; 我的数组是这个类的一个实例数组,但是bcs,根据visualstudio,我的映射对于堆栈来说太大了,我进行了堆分配,MC*map=new MC[1050];//15*70 一切正常,直到玩家死亡,游戏结束,地图被删除,del

我正在制作一个小游戏,我将地图存储在一个数组中,因为我认为不必告诉您我的地图不仅仅是一个字符数组,我已经制作了一个类:

枚举标记{N,Ex3,Ex2,Ex1,Pl,En,Pb,Eb}; 类MC/*映射组件*/{ 公众: 标记=标记::N; char ch='\0'; }; 我的数组是这个类的一个实例数组,但是bcs,根据visualstudio,我的映射对于堆栈来说太大了,我进行了堆分配,MC*map=new MC[1050];//15*70

一切正常,直到玩家死亡,游戏结束,地图被删除,delete[]地图抛出指定给RtlValidateHeap的无效地址[某个十六进制数,可能是一个地址],[某个十六进制数,可能是一个地址]

我知道我可以使用向量,但我只是不想,我想学习更多关于内存管理的知识,更熟悉指针等

编辑:Visual Studio还会打开一个名为delete_scalar.cpp的文件。 该文件的代码:

//
// delete_scalar.cpp
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// Defines the scalar operator delete.
//
#include <crtdbg.h>
#include <malloc.h>
#include <vcruntime_new.h>
#include <vcstartup_internal.h>

////////////////////////////////////////////////////////////////
// delete() Fallback Ordering
//
// +-------------+
// |delete_scalar<----+-----------------------+
// +--^----------+    |                       |
//    |               |                       |
// +--+---------+  +--+---------------+  +----+----------------+
// |delete_array|  |delete_scalar_size|  |delete_scalar_nothrow|
// +--^----^----+  +------------------+  +---------------------+
//    |    |
//    |    +-------------------+
//    |                        |
// +--+--------------+  +------+-------------+
// |delete_array_size|  |delete_array_nothrow|
// +-----------------+  +--------------------+

_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
    #else
    free(block);
    #endif
}
输出:

Before delete
//me pressing something
After delete
//me pressing something
//program crashes

道歉:bcs Visual Studio打开了delete_scalar.cpp我假设delete[]导致程序崩溃,现在我不知道,我很困惑。

好吧,我非常抱歉,bcs事实证明我是个十足的白痴,我的愚蠢是无止境的。我这么说的原因是:当游戏运行时,某些类型的对象会一直被创建、删除和重新创建,我将它们分配到堆中,但我忘了让我的程序删除它们,以防它们在玩家死亡时还活着,我真不敢相信我竟然在这样的事情上花了三天时间,真是个白痴


感谢所有试图解决我的问题的人,即使他们没有所需的信息,我也不知道到底需要什么信息,所以…是的,很抱歉

您没有提供。请检查调用new之后的map值是否与调用delete[]之前的map值相同。可能您已经修改了指针。默认情况下,对于堆栈1MB,您的数组似乎不会太大,但这不是问题所在。我可以为您的问题想出两种解释:1您不能通过删除new返回的值;2您通过执行一些超出范围的访问来覆盖已分配数组的描述符。您几乎不想手动处理清理工作。使用std::array或std::Vector如果您想了解有关内存管理的更多信息,可以编写自己的智能指针/智能数组。在野外新建和删除是危险的
Before delete
//me pressing something
After delete
//me pressing something
//program crashes