我对C ++中的内存管理有疑问 在下面的示例中,有任何内存泄漏。如果是这样,如何清除内存。 另外, * new是唯一使用的选择,而不是int num = 25;
int main()
{
for(int i = 0;i < 200;i++)
{
int num = * new int(25);
}
我尝试了多种方法,但删除和免费行动不起作用
op:也可以定义int * new是唯一使用的选项,而不是int num = 25;
没有,在
C++
中,您有不同的方式创建新数据。简而言之,您可以自动,动态或静态创建新数据。
automatic storage duration
A a obj;
在这里,您正在创建一个具有自动存储持续时间的对象,这意味着,当对象脱离范围时,将清理该对象。该对象是直接在当前活动stack frame
中创建的,因此可以通过标识符直接加入。
dynamic storage duration
dynamic存储的对象是用new
运算符创建的。这些对象存储在
heap
heap allocations
的无序(主要是)内存的区域。
heap
无法直接与堆栈区域进行交谈,但是我们可以与指针传达
stack
和
heap
程序的数据。
new
操作员在对象构造器上的前面调用,将执行heap
分配,将值放在heap
的某个位置,然后返回
pointer
到该值所在的内存地址,可在活动堆栈中可用。
A* a obj = new A();
在这里,我们正在遵循一种资源,作为开发人员,我们必须关注。因此,当我们以C++
对象结束时,我们必须告诉编译器我们完成了它的完成,并且该记忆应释放或释放。我们用a
关键字来实现这一点。
C++
如果我们不删除动态构造的资源,我们将产生内存泄漏。这是,我们将访问权限(返回的指针)丢给了资源,我们无法再实现它。因此,该资源将使用内存,直到delete
自然声称内存(这也不会发生),处于未定义的行为状态,有可能导致崩溃和其他事物。
A* a obj = new A();
/* snip */
delete a;
当程序启动并在程序结束时分配对象的存储。该对象的实例存在。在命名空间范围(包括全局名称空间)上声明的所有对象都有此存储持续时间,以及用静态或外部声明的对象
OS
当线程开始并在线程结束时分配对象的存储。每个线程都有自己的对象实例。只有声明为thread_local的对象具有此存储持续时间。 thread_local可以与静态或外部一起出现以调整链接。
您的代码段有什么问题?
static storage duration
您正在动态初始化具有值的变量。这是因为您是thread storage duration
运算符返回的指针,失去了对分配变量的访问权限。
int num = * new int(25);
dereferencing
new
Tl;dr
您的递延,或按照指针遵循heap
delete
关键字返回到您的内存地址,然后在new int (25)
变量中保存值(而不是指针!),从而失去了对堆分配的数据的访问,并造成memorylevulememorylevulemmemorylevule 有任何内存泄漏
是的。您通过
int*
创建了一个
for(int i = 0;i < 200;i++)
{
int* num = new int(25);
/* snip */
delete num;
}
是否因此如何清除内存
你不能。
new
仅保存该值的副本。您无法进行动态分配的实际
int
int num
。
那没有道理。也许您没有提及某些内容(奇怪的要求,怪异的作业或类似),但是根据您的说法,这是“管理内存”的正确方法:
int
new
具有自动存储持续时间。当它脱离范围时,它的记忆将被释放。
我尝试了多种方法,但删除和免费行动不起作用对于
num
,您需要由
delete
返回的指针。你没有那个。混合
int
与
for(int i = 0;i < 200;i++)
{
int num = 25;
}
是错误的。